若要一个结构体中的数组是可变的,应该这样写
struct _example
{
int size; //数组的大小
char* array; //数组的地址
}example
example tmp;
tmp.size = 100;
tmp.array = (char*)malloc(tmp.size);
这样结构体里的数组的大小是动态分配的,但是这样分配的地址不是连续的,也就是说array指向的这个数组(不是array的地址)不是接在tmp.size地址的后面,这样有时候会不方便,比如说用memcpy去从tmp首地址开始拷贝,只能拷贝到size和array的值(即数组的首地址),如果想要得到数组里的数据就还要用memcpy从取array的值再来拷贝一次,这样就很麻烦,特别是在socket编程的时候,每次传出的数据都是 大小+数据 的模式,如果是这样写的结构体,就得要调用2次传输函数,但是下面这种写法可以解决这个麻烦。。。
struct _example
{
int size; //数组的大小
char array[1]; //数组的地址
}example
int nLen = 100+4;
example* tmp = (example*)malloc(nLen);
tmp.size = 100;
这样其实是一种取巧的方法,为tmp这个指针分配一个大于example结构体的内存,要多大就看你需要的数组要多大了,这样多余的内存就排在了array后面,array的“规定”大小只有1,但是就算array[1],array[2]array[3]…array[99]它都没有越界或者访问到了非法地址,所以可以放心的往后面添加数据,而这块内存是由一次malloc产生的,所以数据块一定是连续的,这样如果要复制tmp里的内容就可以只用memcpy就可以做好了。