C结构体中末尾的data[0]

    一个结构中包含char data[0],数组的长度为零。

    在linux内核中,结构体中经常用到data[0]。
    

struct ac_buffer
    {
        int len;            // 长度
        char data[0];   // 起始地址
    };

    在这个结构中,data是一个数组名;但该数组没有元素;
   
    这种声明方法可以巧妙的实现C语言里的数组扩展。设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct ac
{
    int i;
    char data[0];
};

int main(int argc, char* argv[])
{
    void * p = NULL;
    char buf[10] = "abcdefghi";    
    struct ac * info = (struct ac *)malloc(sizeof(struct ac) + 10);

    info->i = 9;
    p = (void*)info->data;

    printf("%d\n", sizeof(struct ac));        // 4
    printf("info address:%p\n", info, p);    // 0x56542a4742a0   ---> ac结构体的首指针
    printf("   p address:%p\n", p);            // 0x56542a4742a4   ---> p指向的地址,ac结构体的第二个变量的地址+4
    printf("   p address:%p\n", &p);        // p 自身的地址

    strncpy((char*)p, buf, info->i);
    printf("%s\n", (char*)p);                // abcdefghi

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值