由于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]
本质上是否有区别?我们可以通过一个例子来说明。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
代码
+关注
关注
30文章
4719浏览量
68211 -
编译器
+关注
关注
1文章
1616浏览量
49010 -
数组
+关注
关注
1文章
412浏览量
25880
发布评论请先 登录
相关推荐
请问如何将几十K大小的数组存放在flash里面,不占用内存空间呢?
请问如何将几十K大小的数组存放在flash里面,不占用内存空间呢?
用了const好像不管用,还是占用了heap空间。
发表于 07-19 07:10
单片机的存储空间不够用了,有哪些解决办法?
数据或程序;还可以对数据进行压缩处理,在不影响功能的前提下,减少数据占用的存储空间;另外,根据实际需求,重新选择存储空间更大的单片机型号也是一个可行的方案。
上面说发是否正确a
发表于 10-15 22:33
用C语言编程,如何节省存储空间
问题,变量有大有小呀,对的,所以这个时候共用体的空间为内部变量最大占用空间的值。如此这般,共用体就可以通过共享存储空间,来避免当前没有被使用的变量所造成的
发表于 11-19 11:34
C语言存储空间与MCU(单片机)
首先,最近因公司项目需求,暂时学习的去做单片机的开发,因此,需要具备的C编程语言,结合自己以前的移动App开发,总结出如下C语言的常规基础知识;一:存储空间本节介绍nX-U8 内核支持的存储空间。二
发表于 10-28 09:41
•11次下载
云存储空间已满怎么办?
云存储空间已满怎么办?当云存储空间已满时,我们可以采取以下一些常见的步骤来解决问题: 1、删除不必要的文件: 首先,检查云存储中是否有不再需要的文件或数据。删除这些文件可以立即释放存储空间
评论