第十六题
The following is a small C program split across files. What do you expect the output to be, when both of them compiled together and run?
File1.c
int arr[80];
File2.c
extern int *arr;
int main()
{
arr[1] = 100;
return 0;
}
题目讲解:
编译完运行发生段错。
File1.c中声明的是个数组,File2.c中声明的是个指针,虽然名字一样,但俩arr处于不同的内存地址,Flie2.c中的arr==NULL,对0地址操作是非法的。
将File2.c中的”extern int *arr;”改为”extern int arr[80];”就可以了。
第十七题
Explain the output of the following C program (No, the output is not 20).
#include<stdio.h>
int main()
{
int a=1;
switch(a)
{ int b=20;
case 1: printf("b is %d
",b);
break;
default:printf("b is %d
",b);
break;
}
return 0;
}
题目讲解:
输出:b is 0
switch判断后直接跳转到相应的case/default处,不会执行之前的赋值语句。
第十八题
What is the output of the following program? (Again, it is not 40, (if the size of integer is 4)).
#define SIZE 10
void size(int arr[SIZE])
{
printf("size of array is:%d
",sizeof(arr));
}
int main()
{
int arr[SIZE];
size(arr);
return 0;
}
题目讲解:
数组做参数传递时退化为指针,“void size(int arr[SIZE]) ”等价于“void size(int *arr) ”。size(arr)给size函数传入的参数是指针,所以sizeof(arr)是指针的大小。
第十九题
The following is a simple c program, in which there is a function called Error to display errors. Can you see a potential problem with the way Error is defined?
#include <stdlib.h>
#include <stdio.h>
void Error(char* s)
{
printf(s);
return;
}
int main()
{
int *p;
p = malloc(sizeof(int));
if(p == NULL)
{
Error("Could not allocate the memory
");
Error("Quitting....
");
exit(1);
}
else
{
/*some stuff to use p*/
}
return 0;
}
题目讲解:
网上搜了下,没有统一的解释,说说个人的理解。
Google “void Error(char* s)”,发现如下几种打印字符串的方式:
方式1:
void error(char *msg)
{
fprintf(stderr, msg);
}
方式2:
void error(char *msg)
{
printf(msg);
fflush(stdout);
}
方式3:
void error(char *msg)
{
puts(msg);
}
根据第四题的解释我们知道,stdout是行缓冲,只有遇到’ ’,缓冲区的内容才会打印出来,stderr是无缓冲,写向stderr的内容
可以立马打印出来。所以我推断,题目中的Error函数的隐患是,若传进去的字符串不带’ ’,该错误消息就不会立马打印出来,
直到遇到’ ’,或人为fflush(stdout),或缓冲区溢出,或进程退出才会把缓冲区内的错误消息打印出来。
第二十题
What is the differnce between the following function calls to scanf?(Please notice the space carefully in the second call. Try removing it and observe the behaviour of the program)
#include <stdio.h>
int main()
{
char c;
scanf("%c",&c);
printf("%c
",c);
scanf(" %c",&c);
printf("%c
",c);
return 0;
}
题目讲解:
当第二个scanf没有空白符时,运行代码,输入a,回车后,会打印a,换行,换行,然后程序结束,字符’a’被第一个scanf读取,字符’
’被第二个scanf读取;
当第二个scanf有空白符时,运行代码,输入a,回车,输出a,若继续敲回车,程序不结束,直到输入了字符(非换行符)后,打印该字符,程序结束。
C99的7.19.6.2第五条说,包含空白符的指令读取输入中的第一个非空白字符。
A directive composed of white-space character(s) is executed by reading input up to
the first non-white-space character (which remains unread), or until no more characters
can be read.