当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 看书时不要想当然啊,亲!

看书时不要想当然啊,亲!

2018年05月02日  | 移动技术网IT编程  | 我要评论

dota牛蛙照片,钝化处理,广东组织工作

一 写在开头

1.1 本文内容

C语言是一门古老而又高深莫测的编程语言,她身上总是闪烁着各种“巨坑”(对于我这种没参透的菜鸟而言)。实践出真知,亲们在看C语言的资料时可千万别想当然啊。

 

二 开始装13

这是某本关于C语言指针的书中的一个小部分,具体书名不说了,内容如下图所示。

我于是写了一段代码进行验证,代码如下所示。使用gcc -Wall temp.c进行编译。WHAT?gcc没有给出任何报错,顺利生成了a.out文件!难道是没加-ansi选项的缘故,于是加上了-ansi选项重新编译。见鬼了,仍然是没有任何错误或警告出现!执行a.out,结果如下图所示。

 1 /* temp.c */
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     int num = 5;
 7     void *pv = &num;
 8 
 9     printf("sizeof(void *) = %lu\n", sizeof(void *));
10     printf("pv = %p\n", pv);
11     pv = pv + 1;
12     printf("pv = %p\n", pv);
13 
14     return 0;
15 }

稍微解释一下上面的程序。上面的程序之所以使用%lu作为printf的占位符,是因为在64位的ubuntu上,gcc提供的size_t其实是long unsigned int而非unsigned int。

从上面的执行结果来看,void *型指针变量的大小为8个字节,这情有可原,因为这是64位机器。但pv指针在执行pv = pv + 1操作之后,其值并没有按照书中说的那样加8,而只是加1了!(书中假定void *型指针变量大小为4个字节)

 

通过上述实践,收获的教训有:

1. 实践出真知,不要尽信书。尤其是面对C语言这种闪烁着“巨坑”光芒的编程语言!

2. 不要武断地以为编译器没给error或warning的程序就是完美无瑕的程序!尤其是面对这种C标准的未定义行为的时候!想要写好程序还得心中有谱。

3. 避免使用未定义行为!避免使用未定义行为!避免使用未定义行为!比如上述程序中的让void *型指针加1的操作,这不仅无意义还有种作死的赶脚。

 

欢迎各位大佬批评指正,小菜我感激不尽!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网