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

2018-06-18 03:49:22来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

一 写在开头

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的操作,这不仅无意义还有种作死的赶脚。

 

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:理解静态局部变量(static)在程序中的执行规则

下一篇:ELF文件结构描述