0长度数组不占用存储空间 由于0长度数组是GNU C的扩展,有一些巧妙编写的诡异代码,其执行结果就是依赖于编译器和优化策略的实现的,我们来看看以下代码:
#include
#include
int main(void)
{
char a[0];
printf("%pn", a);
char b[0];
printf("%pn", b);
const char *c= "Hello";
printf("%pn", c);
const char *d = "Hello";
printf("%pn", d);
return EXIT_SUCCESS;
}
编译结果是:

可以看到a和b的地址就会被编译器优化到一处,因为a[0] 和 b[0] 对于程序来说是无法使用的,同样编译器对于相同字符串常量,往往地址也是优化到一处,减少空间占用。
所以其本质上涉及到的是一个C语言里面的数组和指针的区别问题,Programming Abstractions in C一书中提到:
“arr is defined to be identical to &arr[0]”.
也就是说,char a[1]里面的a实际是一个常量,即a = &a[0]。而char *b是有一个实实在在的指针变量b存在。所以,a=b是不允许的,而b=a是允许的。
#include
char a[1];
char *b;
int main () {
b = a;
//a=b会报错,incompatible types when assigning to type ‘char[1]’ from type ‘char *’
a = b;
return 0;
}
两种变量都支持下标式的访问,那么对于a[0]和b[0]本质上是否有区别?我们可以通过一个例子来说明。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !