定义:
柔性数组:数组大小待定的数组。
C语言中结构体最后一个元素可以是大小未知的数组。
C语言可以由结构体产生柔性数组
柔性数组的结构如何只能堆上生成
柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)
在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的。
一般的做法是定义一个char*类型的指针,然后指定其长度,代码如下:
typedef struct{
unsigned len;
char* pData;
}Msg;
使用时:
char str[] = "hello world!";
unsigned len = sizeof(str);
Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));
m->len = len;
m->pData = (char*)(m+1);
memcpy(m+1, str, len);
printf("%d, %s\n", m->len, m->pData);
有没有觉得时机上char* pData很多余呢?
因为数据时机的存储位置在m+1,我们可以直接得到这个指针,而不需要重新定义一个char* pData来报错这个位置。
这样带来了另一个问题就是,访问不方便,我们不能用结构体成员的方式来访问了,可以使用柔性数组,且看:
typedef struct{
unsigned len;
char data[];
}Message;
使用起来就是这样
Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));
msg->len = len;
memcpy(msg->data, str, len);
printf("%d, %s\n", msg->len, msg->data);
free(msg);
来分完整代码对比下:
typedef struct{
unsigned len;
char* pData;
}Msg;
typedef struct{
unsigned len;
char data[];
}Message;
// test for 0 size array
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "array0.h"
int main()
{
char str[] = "hello world!";
unsigned len = sizeof(str);
// 普通用法
Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));
m->len = len;
m->pData = (char*)(m+1);
memcpy(m+1, str, len);
printf("%d, %s\n", m->len, m->pData);
free(m);
// 柔性数组
Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));
msg->len = len;
memcpy(msg->data, str, len);
printf("%d, %s\n", msg->len, msg->data);
free(msg);
system("pause");
return 0;
}
转载自
附自己测试代码
#include <iostream>
using namespace std;
typedef struct{
unsigned len;
char* pData;
}Msg;
typedef struct{
unsigned len;
char pData[];
}Msg1;
int main(void)
{
Msg m;
cout << sizeof(m) << endl; //16
cout << &m << endl; // x
cout << &(m.len) << endl; //x
cout << &(m.pData) << endl; //x+8
//
cout << "-----" << endl;
Msg1 m1;
cout << sizeof(m1) << endl; //4
cout << &m1 << endl; // x
cout << &(m1.len) << endl; //x
cout << &(m1.pData) << endl; //x+4
return 0;
}
结果