0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

0长度数组不占用存储空间

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-09-28 15:18 次阅读

由于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;
}

编译结果是:

pYYBAGMz9PuAQcqxAAA-OXsqEvM539.png

可以看到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
收藏 人收藏

    评论

    相关推荐

    嵌入式中零长度数组基本操作方法

    C语言零长度数组,听起来可能有点奇怪,因为它没有分配内存空间,无法存储数据。但实际上,零长度数组在Linux内核中随处可见。 零长度数组的定
    的头像 发表于 05-11 08:49 830次阅读
    嵌入式中零<b class='flag-5'>长度数组</b>基本操作方法

    请问如何将几十K大小的数组存放在flash里面,不占用内存空间呢?

    请问如何将几十K大小的数组存放在flash里面,不占用内存空间呢? 用了const好像不管用,还是占用了heap空间
    发表于 07-19 07:10

    单片机的存储空间不够用了,有哪些解决办法?

    数据或程序;还可以对数据进行压缩处理,在不影响功能的前提下,减少数据占用存储空间;另外,根据实际需求,重新选择存储空间更大的单片机型号也是一个可行的方案。 上面说发是否正确a
    发表于 10-15 22:33

    IN100 eFuse存储空间分布

    存储空间
    橙群微电子
    发布于 :2023年06月12日 10:20:08

    I/O存储空间什么意思?

    DSP的片内存储,不是只有程序存储空间区(RAM)和数据存储空间区(ROM)吗?那个 I/O存储空间区是什么意思?它属于片内存储吗?
    发表于 05-29 21:26

    用C语言编程,如何节省存储空间

    问题,变量有大有小呀,对的,所以这个时候共用体的空间为内部变量最大占用空间的值。如此这般,共用体就可以通过共享存储空间,来避免当前没有被使用的变量所造成的
    发表于 11-19 11:34

    请问C语言中内存地址是否占用存储空间呢?

    比如内存地址0028FF1C 这些数字和字母是否需要占用存储空间呢?原因是?
    发表于 05-25 10:14

    存储空间的分配

    (1)存储空间的分配###1.片上SRAM
    发表于 07-28 06:06

    采用存储空间循环使用方法达到延长flash使用寿命

    存储代码占用Ram资源极少,不占用Flash用于存储数据的空间,采用存储空间循环使用方法达到延
    发表于 01-26 06:25

    请问一下怎样使定义的字符串数组不占用RAM空间呢?

    ads里没有CODE关键词,怎样使定义的字符串数组不占用RAM空间呢?
    发表于 11-30 14:28

    怎样使定义的字符串数组不占用RAM空间呢?

    ads 里没有 CODE 关键词,怎样使定义的字符串数组不占用 RAM 空间
    发表于 03-09 10:51

    存储空间的概念

    什么是云存储空间存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间
    发表于 05-09 11:59 2281次阅读

    C语言存储空间与MCU(单片机)

    首先,最近因公司项目需求,暂时学习的去做单片机的开发,因此,需要具备的C编程语言,结合自己以前的移动App开发,总结出如下C语言的常规基础知识;一:存储空间本节介绍nX-U8 内核支持的存储空间。二
    发表于 10-28 09:41 11次下载
    C语言<b class='flag-5'>存储空间</b>与MCU(单片机)

    存储空间已满怎么办?

    存储空间已满怎么办?当云存储空间已满时,我们可以采取以下一些常见的步骤来解决问题: 1、删除不必要的文件: 首先,检查云存储中是否有不再需要的文件或数据。删除这些文件可以立即释放存储空间
    的头像 发表于 11-14 17:44 4202次阅读

    Synology如何使用Nvme固态做存储空间

    Synology 如何使用Nvme固态做存储空间
    发表于 10-09 10:55 0次下载