本文章引用值左耳朵耗子老师的博客,用来进行转载学习!!!
首先列出一段代码看看各位能不能发现其中的问题。
#include <stdio.h>
struct str{
int len;
char s[0];
};
struct foo {
struct str *a;
};
int main(int argc, char** argv) {
struct foo f={0};
if (f.a->s) {
printf( f.a->s);
}
return 0;
}
你编译一下上面的代码,在VC++和GCC下都会在14行的printf处crash掉你的程序。@Laruence 说这个是个经典的坑,我觉得这怎么会是经典的坑呢?上面这代码,你一定会问,为什么if语句判断的不是f.a?而是f.a里面的数组?写这样代码的人脑子里在想什么?还是用这样的代码来玩票?不管怎么样,看过原微博的回复,我个人觉得大家主要还是对C语言理解不深,如果这算坑的话,那么全都是坑。
接下来,你调试一下,或是你把14行的printf语句改成:
printf("%x\n", f.a->s);
你会看到程序不crash了。程序输出:4。 这下你知道了,访问0x4的内存地址,不crash才怪。于是,你一定会有如下的问题:
- 为什么不是 13行if语句出错?f.a被初始化为空了嘛,用空指针访问成员变量为什么不crash?
- 为什么会访问到了0x4的地址?靠,4是怎么出来的?
- 代码中的第4行,char s[0] 是个什么东西?零长度的数组?为什么要这样玩?
哈哈哈哈,先留下这个问题,剩下的明天继续!!!