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]本质上是否有区别?我们可以通过一个例子来说明。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分