看书时不要想当然啊,亲!
2018-06-18 03:49:22来源:未知 阅读 ()
一 写在开头
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的操作,这不仅无意义还有种作死的赶脚。
欢迎各位大佬批评指正,小菜我感激不尽!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:ELF文件结构描述
- p1969积木大赛 2019-02-25
- 第四章 基本编程技术 2018-12-04
- hdu2089不要62加强版 2018-06-27
- JavaScript初学者建议:不要去管浏览器兼容 2018-06-18
- 02-C#入门(枚举、结构等) 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash