柔性数组

原创 2016年08月29日 12:50:24
结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组。
但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小。柔性数组到底如何使用

例子:

点击(此处)折叠或打开

  1. typedef struct st_type
  2. {
  3.    int i; 
  4.    int a[0];
  5. }type_a;
有些编译器报错无法编译可改成:

点击(此处)折叠或打开

  1. typedef struct st_type
  2. {
  3.    int i;
  4.    int a[];
  5. }type_a;
这样,我们定义一个可变长的结构体,用sizeof(type_a)得到的只有4,就是sizeof(i) = sizeof(int). 那个0元素的数组没有占用空间,而后我们就可以进行变长操作了。通过如下表达式结构体分配内存:

点击(此处)折叠或打开

  1. type_a *= (type_a*)malloc(sizeof(type_a) + 50*sizeof(int));
这样我们为结构体指针 P 分配了一块内存。但是这个时候我们在用 sizeof(*p) 测试结构体的大小,发现仍然是4。可见,结构体的模已经定了。而多分配出来的内存是又变长数组使用。

在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
         实际用时采取这样:
         struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
         这样就可以通过p->data 来操作这个str


点击(此处)折叠或打开

  1. #include <</span>iostream>

  2. using namespace std;

  3. struct MyData 
  4. {
  5.     int nLen;
  6.     char data[0];
  7. };

  8. int main()
  9. {
  10.     int nLen = 10;
  11.     char str[10] = "123456789";

  12.     cout <</span><</span> "Size of MyData: " <</span><</span> sizeof(MyData) <</span><</span> endl;

  13.     MyData *myData = (MyData*)malloc(sizeof(MyData) + 10);
  14.     memcpy(myData->data, str, 10);

  15.     cout <</span><</span> "myData's Data is: " <</span><</span> myData->data <</span><</span> endl;

  16.     free(myData);

  17.     return 0;
  18. }
输出:

点击(此处)折叠或打开

  1. Size of MyData: 4
  2. myData's Data is: 123456789

柔性数组成员

如果需要在结构体中存放一个动态长度的字符串,一般的做法,是在结构体中定义一个指针成员,该指针指向该字符串所在的动态内存空间,例如: typedef struct test {   int a;   d...
  • gqtcgq
  • gqtcgq
  • 2015年12月16日 22:45
  • 753

C/C++中的柔性数组(可伸缩性数组)

在STL源码中的第2级空间配置器有一个联合定义如下: union obj { union obj* free_list_link;   char client_data[1];  }; 在侯大师的...
  • vgxpm
  • vgxpm
  • 2015年01月19日 12:08
  • 1167

深入浅出C语言中的柔性数组

深入浅出C语言中的柔性数组 在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如:typedef s...
  • ce123
  • ce123
  • 2013年05月25日 14:46
  • 9921

C++中的0长数组(柔性数组)

在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:StructPacket...
  • hyqsong
  • hyqsong
  • 2016年06月14日 09:09
  • 262

浅议柔性数组

很多时候,柔性数组应用在了变长结构体中,如: StructPacket { Int state; Int len; Char cData[0]; //这里的0长结构体就为变长结构体提供了非常...
  • pbymw8iwm
  • pbymw8iwm
  • 2013年07月24日 15:08
  • 1118

C/C++——柔性数组

1、问题来源在博文数据结构和算法——kd树中,在构建kd树的过程中,有如下的一段代码:#define MAX_LEN 1024typedef struct KDtree{ double...
  • google19890102
  • google19890102
  • 2017年02月16日 20:29
  • 728

3----结构体中使用柔性数组

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需要占...
  • u013165704
  • u013165704
  • 2016年12月19日 08:23
  • 688

c结构体中的 柔性数组

开发C代码时,经常见到如下类型的结构体定义: 1 2 3 4 5 typedef struct list_t{ ...
  • Stand1210
  • Stand1210
  • 2016年09月07日 14:34
  • 807

柔性管理法则与柔性管理案例

转载自:http://www.caecp.cn/News/News-954.html 柔性管理是在研究人们心理和行为规律的基础上采用非强制方式,在人们心目中产生一种潜在的说服力,从而把组织意志变为人...
  • yangxuehui1990
  • yangxuehui1990
  • 2015年01月12日 14:39
  • 1474

柔性显示实现的关键技术

1 引言     柔性显示技术主要应用柔性电子技术,将柔性显示介质电子元件与材料安装在有柔性或可弯曲的基板上,使得显示器具有能够弯曲或卷曲成任意形状的特性,有轻、薄且方便携带等特点。按照使用的情况,...
  • cluzax
  • cluzax
  • 2014年07月24日 17:44
  • 3102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:柔性数组
举报原因:
原因补充:

(最多只允许输入30个字)