0長度數組是個奇怪的東西, 下面的代碼(兩種形式之一)是可以通過編譯的. char buf[]; 或者 char buf[0]; 有什么用處呢? 大家知道數組名其實是數組所在內存的首地址, 那么0長度數組的名字,其實是在內存某個地方中作了一個標記, 在適合的時候將這個標記后面的一段內存作為這個數組的內容. 貌似數組下標溢出了,但是善于利用這點可以實現一個”變長”結構體.
例如下面的代碼:
CODE:#include <stdio.h> #include <stdlib.h> #include <string.h>
static const size_t def_name_len = 32 ; typedef struct __Name { size_t index; size_t len; char buf[0]; } Name, *PName ;
Name * createName(size_t index, const char * strname) { size_t len; PName pname = NULL; if (strname == NULL) { len = def_name_len; } else { len = strlen(strname); } pname = (PName) malloc( sizeof(Name) + len + 1); if(pname == NULL) return NULL;
pname->index = index; pname->len = len; pname->buf[0] = '\0'; |