欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-04 08:24:47
一 写在开头 1.1 本文内容 C语言是一门古老而又高深莫测的编程语言,她身上总是闪烁着各种“巨坑”(对于我这种没参透的菜鸟而言)。实践出真知,亲们在看C语言的资料时可千万别想当然啊。 二 开始装13 这是某本关于C语言指针的书中的一个小部分,具体书名不说了,内容如下图所示。 我于是写了一段代码进行 ......

一 写在开头

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

 

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