看书时不要想当然啊,亲!
一 写在开头
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 = # 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的操作,这不仅无意义还有种作死的赶脚。
欢迎各位大佬批评指正,小菜我感激不尽!
上一篇: ORCAL练习题46道(附答案)
下一篇: 触屏时代 如何延长三星手机触摸屏使用寿命
推荐阅读