struct{ long a; long b; char buf[];}structA;struct{ long a; long b; char *buf;}structB;
structA与structB是两个不同的结构体,它们的长度大小分别为structA为8,而structB为12, 因为char[]是数组,C99允许不指定大小的数组,而这样则不占用内存空间,而*buf是指针,它占用了指针的大小。 使用structA的好处就是可以malloc内存的时候,直接减少malloc调用次数。 structA *stA= (structA*)malloc(sizeof(structA) + n); 但是如果使用structB则需要以下方式申请内存空间: structB *stB= (structB*)malloc(sizeof(structA));stB->buf = (char*)malloc(sizeof(char)*n);
当然也可以使用以下方式: structB *stB = (structB*)malloc(sizeof(structB) + n);stB->buf = (char*)(stB + sizeof(stB)); 但是这样做的缺点很明显: 1,申请多了一个字节空间; 2,多做了一次指针操作。
水利万物而不争,
而万物莫能与之争。