/*
訪问成员数组名事实上得到的是数组的相对地址。而訪问成员指针事实上是相对地址里的内容
*/

struct buf_str
{int  length;char buf[0];
};struct foo
{buf_str* pbuf;
};void test_funny()
{foo f = {0};printf("%x\n", f.pbuf);printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf);printf("%x\n", f.pbuf->buf);      if (f.pbuf->buf) //没有申请内存,可是能够訪问相对地址,*数组名就是相对地址*{//printf(f.pbuf->buf); //crash,等价于printf("%s", f.pbuf->buf);指针的内容}
}struct buf_str1
{int  length;char *buf;
};struct foo1
{buf_str1* pbuf;
};void test_funny1()
{foo1 f = {0};printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf); //指针的相对地址。 和前面的比較。也和以下的比較printf("%x\n", f.pbuf->buf); //指针所指内容的地址,*訪问指针,就是訪问相对地址里面的内容*  crashif (f.pbuf->buf) //crash, 訪问内容{printf(f.pbuf->buf);}
}

/*关于长度为0的数组,柔性数组意义*/
/*第一个意义是,方便内存释放。假设我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,
并把整个结构体返回给用户。用户调用free能够释放结构体,可是用户并不知道这个结构体内的成员
也须要free。所以你不能指望用户来发现这个事。所以,假设我们把结构体的内存以及其成员要的内存
一次性分配好了,并返回给用户一个结构体指针。用户做一次free就能够把全部的内存也给释放掉。

(读到这里,你一定会认为C++的封闭中的析构函数会让这事easy和干净非常多)

第二个原因是。这样有利于訪问速度。

连续的内存故意于提高訪问速度,也故意于降低内存碎片。
(事实上。我个人认为也没多高了,反正你跑不了要用做偏移量的加法来寻址)

*/

void test_funny2()
{printf("buf_str size : %d\n", sizeof(buf_str));//只输出4,零长度的数组是存在于结构体内的。可是不占结构体的sizeint buf_len = 10;////长度为0数组的使用方法buf_str* pBuf = (buf_str*)malloc(sizeof(buf_str) + sizeof(char)*(buf_len+1));//连续的内存pBuf->length = buf_len+1;memset(pBuf->buf, 'a', sizeof(char) * buf_len);pBuf->buf[buf_len] = '\0';printf("%d  %s\n", pBuf->length, pBuf->buf);free(pBuf);//只释放一次内存pBuf = NULL;//////正常的申请buf_str1* pBuf1 = (buf_str1*)malloc(sizeof(buf_str1));  (pBuf1->buf) = (char*)malloc(sizeof(char)*(buf_len+1)); //内存可能不连续。须要两次释放pBuf1->length = buf_len+1;memset(pBuf1->buf, 'a', sizeof(char) * buf_len);pBuf1->buf[buf_len] = '\0';printf("%d  %s\n", pBuf1->length, pBuf1->buf);free(pBuf1->buf);free(pBuf1);pBuf = NULL;
}

原文来自于

http://coolshell.cn/articles/11377.html

仅仅只是提取了主要内容,并測验

转载于:https://www.cnblogs.com/liguangsunls/p/6791908.html

c结构体里的数组与指针相关推荐

  1. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  2. 【C语言】深度探索offsetof,解析结构体的成员数组和指针

    目录 一.offsetof的功能 二.自定义offsetof 三.探索结构体 3.1结构体中的成员 3.2结构体指针和数组 该篇博客主要讲了自定义offsetof是如何实现的,为什么要这样写,以此沿生 ...

  3. 2020重学Go系列:反引号的妙用—结构体里的 Tag 标签

    转载地址:https://www.toutiao.com/i6854075652757422595/?tt_from=weixin&utm_campaign=client_share& ...

  4. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)

    前言 C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构 结构体用处 结构体到底有什么用? ...

  5. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  6. C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP

    事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...

  7. matlab单元数组与结构体的区别,MATLAB中的结构体和单元数组

    MATLAB中的结构体和单元数组 一.结构: x.real=10 x.imag=5 增加字段 x.scale=1 使用struct函数 s=struct('field1',values1,'field ...

  8. C语言 结构体里的元素前面有一点“.”代表什么意思?

    如: 答: 前面不加点也可以赋值,加 "."的话可以不考虑赋值顺序,比如可以先给resolution赋值,在给output赋值,可以写成这样: struct atag_tcc_en ...

  9. Golang之空结构体和零长数组的实践

    空结构体和零长数组(两个复合类型)都仅仅是一个占位符,不占用空间,这里编译器进行了优化,如果结构体或数组的unsafe.sizeof=0则直接返回zerobase. // 必须用key来初始化结构体 ...

最新文章

  1. php case语句 分号
  2. mac 终端快捷命令
  3. DELPHI实现游戏内存的修改
  4. 常用的方法论-鱼骨图
  5. 前端那些年----Webstream快捷键备忘(mac)
  6. hybris backoffice创建product遇到的synchronization问题和解答
  7. java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...
  8. Prime算法生成迷宫
  9. 批改网禁止粘贴怎么破_重大利好!教育部声明,要求家长批改作业等行为,发现一起严处一起...
  10. BN=批归一化+缩放位移=(batchNorm层+scale层)
  11. 贝叶斯公式52张牌猜黑桃A策略
  12. C语言:大小字母转换(ASCII码)
  13. XP桌面背景文件路径
  14. 数字图像处理技术与应用练习题
  15. 【Windows】外接USB键盘报“无法找到驱动”——手动指定驱动
  16. Android 自定义圆形进度条带图片旋转
  17. 仿QQ音乐下载歌曲头部导航
  18. day9-字符串和集合作业
  19. 微积分Z2 J2 典型函数
  20. linux升级wine1.7,Wine 1.7.43 发布下载

热门文章

  1. java string document_java - String 和 document 的相互转换总结
  2. (4)nginx:日志以及定时切割日志小例子
  3. c语言结构体赋值,并输出各种类型变量的值
  4. matlab怎么删除上一条命令_怎么恢复电脑上删除的图片?四大步搞定
  5. python while-Python天坑系列(一):while 1比while True更快?
  6. 【Numpy学习记录】np.cov详解
  7. DualGan 学习笔记
  8. 用户画像2种数据存储的方式
  9. Tensorflow从入门到精通之:Tensorflow基本操作
  10. 聊聊JVM(九)理解进入safepoint时如何让Java线程全部阻塞