看以前自己写的一篇文章时有感: https://yonghaowu.github.io//2018/03/05/C_is_not_easy/ 萌新一个,抛砖引玉,欢迎 v 友指点
/* #include <stdio.h> */
/* #include <malloc.h> */
int main(){
char *c = malloc(10);
c[0] = 'a';
printf("hi, ");
printf("%s\n", c);
free(c);
return 0;
}
为什么这个程序缺了头文件, 依然可以正常编译运行, 并且有正确的结果?
/* #include <stdio.h> */
/* #include <malloc.h> */
/* #include <assert.h> */
int main(){
char *c = malloc(10);
c[0] = 'a';
printf("hi, ");
printf("%s\n", c);
assert(c[0] >= 0.0);
free(c);
return 0;
}
为啥这个程序, 加了 assert 又不行了呢?
那为什么 assert 就不行了呢? 因为 assert 是一个宏,而不是函数,所以编译器不会像上述那样去处理。当没有引入 assert.h, 编译器便当它是函数来处理,最终 stdlib 里也找不到 assert 这个函数,就报错了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.