当前位置: 首页 > article >正文

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


http://www.kler.cn/news/11906.html

相关文章:

  • Java-类的知识进阶
  • yocto 任务
  • 如何构建敏捷项目管理团队?
  • XML与JSON知识学习
  • 防火墙iptables
  • JavaSE学习进阶day03_01 多态
  • MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合-图像识别(论文篇三)
  • Linux-重启相关日志
  • ChatGPT 被大面积封号,到底发生什么了?
  • 每周一算法:高精度乘法(二)大整数乘大整数
  • UWB成为智慧工厂时代的代表技术
  • 【Linux进阶篇】系统监控命令
  • 什么是Android FrameWork,请你介绍一下?
  • ChatGPT研究报告:AIGC带来新一轮范式转移
  • STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别
  • Kettle(9.3.0)连接ClickHouse
  • Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?
  • 训练自己的ai模型(三)学习笔记与项目实操(一些概念理解杂谈)
  • 手游平台源码有什么用处?
  • 套利策略样本外跟踪
  • 网络原理之初识
  • 【c/c++编译工具】——Cmake的学习
  • Jetpack Compose之对话框和进度条
  • JavaScript 进阶 - 0基础第一天
  • Elasticsearch使用篇 - 管道聚合
  • 【Spring源码】Spring事务原理
  • 在 Rocky linux 8.7 使用 Kubespray v2.21.0 离线部署 kubernetes v1.24.0 集群
  • 密码基础知识——密码的概念与作用
  • 【云原生】k8s NetworkPolicy 网络策略是怎么样的
  • ctf做题记录本