第十六题

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[];
File2.c
extern int *arr;
int main()
{
arr[] = ;
return ;
}

题目讲解:

编译完运行发生段错。

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 ).
#include<stdio.h>
int main()
{
int a=;
switch(a)
{ int b=;
case : printf("b is %d\n",b);
break;
default:printf("b is %d\n",b);
break;
}
return ;
}

题目讲解:

输出:b is 0

switch判断后直接跳转到相应的case/default处,不会执行之前的赋值语句。

第十八题

What is the output of the following program? (Again, it is not , (if the size of integer is )).
#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 ;
}

题目讲解:

数组做参数传递时退化为指针,“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();
}
else
{
/*some stuff to use p*/
}
return ;
}
题目讲解:
网上搜了下,没有统一的解释,说说个人的理解。
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 ;
}
题目讲解:
当第二个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 first non-white-space character (which remains unread), or until no more characters
can be read.

C puzzles详解【16-20题】的更多相关文章

  1. C puzzles详解【13-15题】

    第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...

  2. C puzzles详解【9-12题】

    第九题 #include <stdio.h> int main() { float f=0.0f; int i; ;i<;i++) f = f + 0.1f; if(f == 1.0 ...

  3. C puzzles详解【6-8题】

    第六题 #include<stdio.h> int main() { ; switch(a) { ': printf("ONE\n"); break; ': print ...

  4. C puzzles详解【51-57题】

    第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You ...

  5. C puzzles详解【46-50题】

    第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...

  6. C puzzles详解【38-45题】

    第三十八题 What is the bug in the following program? #include <stdlib.h> #include <stdio.h> # ...

  7. C puzzles详解【34-37题】

    第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...

  8. C puzzles详解【31-33题】

    第三十一题 The following is a simple C program to read and print an integer. But it is not working proper ...

  9. C puzzles详解【26-30题】

    第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...

  10. C puzzles详解【21-25题】

    第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main( ...

随机推荐

  1. SOA 与 DDD

    SOA是技术架构方面,Evans DDD则是哲学方法论方面,所属方向不一样,或者说两者非常的无关.甚至是两个不同方向.使用DDD可以将系统从无到有到大建立起来,而大到一定程度,就需要SOA,整合异构. ...

  2. Java多线程之join

    1.join方法只有在继承了Thread类的线程中才有. 2.线程必须要start() 后再join才能起作用. 将另外一个线程join到当前线程,则需要等到join进来的线程执行完才会继续执行当前线 ...

  3. 拥抱 Android Studio 之五:Gradle 插件开发

    实践出真知 笔者有位朋友,每次新学一门语言,都会用来写一个贪吃蛇游戏,以此来检验自己学习的成果.笔者也有类似体会.所谓纸上得来终觉浅,绝知此事要躬行.这一章,笔者将以开发和发布一个 Gradle 插件 ...

  4. RSpec自定义matcher

    链接 https://relishapp.com/rspec/rspec-expectations/v/3-4/docs/custom-matchers/define-a-custom-matcher ...

  5. 无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

    原文链接:http://www.cnblogs.com/IT-Bear/archive/2012/01/04/2311546.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET S ...

  6. Python之几个技巧特点

    今天偶然看到一篇文章<你可能不知道的30个Python语言的提点技巧>,虽然做python有几年了,但中间还是好多不知道或没想到,特在这里做下摘抄. 原文地址: http://soft.c ...

  7. C Primer Plus(第五版)2

    在本章中你将学习下列内容------------------------------------------------------------------1.运算符:= 2.函数:main(),pr ...

  8. [HDU 4082] Hou Yi's secret (简单计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多 ...

  9. java数据结构之列表——ArrayList,LinkedList,比较

    刚看完<数据结构与算法分析java语言描述>的第3章中的表,下面回忆下主要知识点,主要说明各列表之间的关系,以及各自的优缺点.其中牵涉到内部类和嵌套类. 1 Collection APIp ...

  10. Drupal8开发教程:认识.info.yml文件

    YAML 文件是新引入的重要项目文件,在 Drupal 8 中,无论是模块.主题还是安装配置文件,都需要 .info.yml 文件来为其存储项目相关的基础信息. 在 Drupal 中,.info.ym ...