在遊戲前後端交換的過程中,經常會用到變成的訊息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。
一般的做法是定義乙個char*型別的指標,然後指定其長度,**如下:
typedef structmsg;
使用的時候是這樣的:
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 structmessage;
使用起來就是這樣的:
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);
來分完整**對比下:
// array0.h
typedef structmsg;
typedef structmessage;
// main.c
// test for 0 size array
#include #include #include #include "array0.h"
int main()
C語言不定長訊息之柔性陣列
c語言不定長訊息之柔性陣列 柔性陣列 陣列大小待定的陣列。c語言中結構體最後乙個元素可以是大小未知的陣列。c語言可以由結構體產生柔性陣列。柔性陣列的結構如何只能堆上生成,柔性陣列是c99的擴充套件,簡而言之就是乙個在struct結構裡的標識佔位符 不佔結構struct的空間 在遊戲前後端交換的過程中...
C語言 柔性陣列
柔性陣列 flexible array 也叫伸縮性陣列,其實就是變長陣列,反映了c語言對精煉 的極致追求。這種 結構產生於對動態結構體的需求。比如我們需要在結構體中存放乙個動態長度的字串,這時候,柔性陣列可以大顯身手了。c99使用不完整型別來實現柔性陣列,標準形式如下 struct mystruct...
C語言柔性陣列
1 柔性陣列 c語言中結構體的最後乙個元素可以是大小未知的陣列 c語言中可以由結構體產生柔性陣列 typedef struct soft array softarray 可以試試,printf d sizeof softarray 列印出它的sizeof 大小 結果是4,也就是說array這個未知長...