代码改变世界

零长度数组的妙用

  youxin  阅读(1456)  评论(0编辑  收藏  举报

 

零长度是指定义数组时,指定其长度为0(如int arr[0];),这样的数组不占用实际的空间,但能通过数组名访问到其指向的地址。如下例所示:

复制代码
#include <stdlib.h>
#include <stdio.h>
struct device
{
    int num;
    int count;
    int reserve[0]; 
/* 
* reserve是一个数组名;该数组没有元素;该数组的其实地址紧随结构体device之
* 后;这种声明方法可以巧妙的实现C语言里的数组扩展,比将reverse定义为指针,
* 再为指针分配空间的做法要简单一些,并且可以节省一个指针的存储空间
*/
};


int main()
{
    struct device * p_dev =
        (struct device *) malloc (sizeof(struct device) + sizeof(int)*25);
    //sizeof(int)*25是数组reserve的具体空间(25个元素)

    p_dev->reserve[0] = 100;
    p_dev->reserve[24] = 0;

    printf("p_dev->reserve[0] = %d\n", p_dev->reserve[0]);
    printf("p_dev->reserve[24] = %d\n", p_dev->reserve[24]);
    printf("sizeof(struct device) = %d\n",sizeof(struct device));

    //将结构体device之后的第一个内容(int值,其实就是reserve[0]的值) 赋值给a


    int a = *(&p_dev->count + 1);
    printf("a = %d\n", a);
    return 0;
}
复制代码

运行结果:

p_dev->reserve[0] = 100

p_dev->reserve[24] = 0

sizeof(struct device) = 8

a = 100

 

内存布局:

num

count

reverse[0]

reverse[24]

|<-------struct device-------->|

几个注意点:

 长度为0的数组并不占有内存空间,而指针方式需要占用内存空间。

l 对于长度为0数组,在申请内存空间时,采用一次性分配的原则进行;对于包含指针的结构体,才申请空间时需分别进行,释放时也需分别释放。

l 对于长度为0的数组的访问可采用数组方式进行。

 

 

转自:

http://blog.chinaunix.net/uid-20196318-id-28810.html

---恢复内容结束---

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2014-08-09 get started with laravel
2013-08-09 php __autoload使用
2013-08-09 转:C++ 匿名namespace的作用以及它与static的区别
2013-08-09 c++ namespace命名空间详解
2013-08-09 php前端控制器设计1
2013-08-09 php 解析url 和parse_url使用
2013-08-09 PHP $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 之间的区别
点击右上角即可分享
微信分享提示