/*

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

*/

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); //指针所指内容的地址,*訪问指针,就是訪问相对地址里面的内容* crash
if (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,零长度的数组是存在于结构体内的。可是不占结构体的size int 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

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

c结构体里的数组与指针的更多相关文章

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

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

  2. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...

  3. c#中关于结构体和字节数组转化

    最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System ...

  4. C#结构体和字节数组的转换函数

    在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到.   一般都会采用结构来表示字节数组.但结构 ...

  5. c# 调用c++sdk时结构体与byte数组互转

    /// <summary> /// 由结构体转换为byte数组 /// </summary> public static byte[] StructureToByte<T ...

  6. 深入理解指针—>结构体里的成员数组和指针

    单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如 ...

  7. C语言结构体里的成员数组和指针

    struct test{ int i; char *p; }; struct test *str; ; char *b = "ioiodddddddddddd"; str = (s ...

  8. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  9. c++与C# winform的消息通讯--(结构体与byte数组的使用)

    近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 b ...

随机推荐

  1. Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!

    因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...

  2. Coloring Torus(Atcoder Grand Contest 030 C)

    怎么外国都喜欢考脑筋急转弯…… 题意 输入 $k$,要求构造一个 $n\times n$ 的矩阵($n$ 自选),使得恰好用 $k$ 中颜色把每个点都染色,并且同一种颜色的格子周围 相邻的每种颜色数量 ...

  3. Distinct Substrings(spoj 694)

    题意:要求不同子串的个数 /* 先求出height数组,不难看出height之和就是重复的字符串个数,用总的减去它就行了. */ #include<cstdio> #include< ...

  4. APUE 学习笔记(八) 线程同步

    1. 进程的所有信息对该进程内的所有线程都是共享的 包括 可执行的程序文本.程序全局内存.堆内存以及文件描述符 线程包含了表示进程内执行环境必需的信息,包括线程ID.寄存器值.栈.调度优先级和策略.信 ...

  5. Problem 2111 Min Number

                                                                                                        ...

  6. openxml的视频教程

    http://msdnwebcast.net/webcast/0/1980/#1032360142 最近发现的一个openxml的视频教程

  7. 清澄 A1485. Catch The Penguins 抓企鹅

    试题来源 2013中国国家集训队论文答辩 问题描述 Xyz带着他的教徒们乘着科考船一路破冰来到了南极大陆,发现这里有许许多多的企鹅.邪恶的Xyz想要抓很多企鹅回去开动物园,当宠物玩.但动物保护协会很快 ...

  8. 【CF711C】Coloring Trees(DP)

    题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...

  9. linux 头文件以及库的路径

    原来在编译的时候可以指定执行时去哪里找需要的lib文件,长知识了 本文详细介绍了Linux 下gcc头文件指定方法,以及搜索路径顺序的问题.另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论 ...

  10. Ruby自动化测试(操作符的坑)

    事情是这样的: times++ @ddr = DDR::DDR.new() 执行到这里的时候,总是报错:'+@' undefied method.刚开始的时候以为是机器在重启过程中一些不稳定函数调用或 ...