首页 > 代码库 > C puzzles详解【16-20题】

C puzzles详解【16-20题】

第十六题

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\n",b);                  break;          default:printf("b is %d\n",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\n",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\n");          Error("Quitting....\n");          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是行缓冲,只有遇到’\n’,缓冲区的内容才会打印出来,stderr是无缓冲,写向stderr的内容
可以立马打印出来。所以我推断,题目中的Error函数的隐患是,若传进去的字符串不带’\n’,该错误消息就不会立马打印出来,
直到遇到’\n’,或人为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\n",c);      scanf(" %c",&c);      printf("%c\n",c);      return 0;  }
题目讲解:
当第二个scanf没有空白符时,运行代码,输入a,回车后,会打印a,换行,换行,然后程序结束,字符’a’被第一个scanf读取,字符’\n’被第二个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 ?rst non-white-space character (which remains unread), or until no more characters
can be read.

C puzzles详解【16-20题】