c語言不定長訊息之柔性陣列:柔性陣列:陣列大小待定的陣列。c語言中結構體最後乙個元素可以是大小未知的陣列。c語言可以由結構體產生柔性陣列。
柔性陣列的結構如何只能堆上生成,柔性陣列是c99的擴充套件,簡而言之就是乙個在struct結構裡的標識佔位符(不佔結構struct的空間)
在遊戲前後端交換的過程中,經常會用到變成的訊息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。
一般的做法是定義乙個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);
來分完整**對比下:
typedef structmsg;
typedef structmessage;
// test for 0 size array
#include
#include
#include
#include "array0.h"
int main()
附自己測試**
#include
using namespace std;
typedef structmsg;
typedef structmsg1;
int main(void)
結果
C語言變長訊息定義 柔性陣列
在遊戲前後端交換的過程中,經常會用到變成的訊息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。一般的做法是定義乙個char 型別的指標,然後指定其長度,如下 typedef structmsg 使用的時候是這樣的 char str hello world unsigned le...
C 變長陣列,不定長陣列
在c 程式設計中,經常的遇到一種情況 需要定義乙個陣列,但陣列的長度不定,因為這個長度是根據某些其他條件確定的,這時就需要定義乙個變長的陣列。這時可以按如下樣式進行定義,以先是定義乙個不定長結構體陣列 結構體為 struct myarry int arr count get need count a...
linux中 不定長陣列 柔性陣列(c99支援)
free a 只是將指標a指向的連續記憶體區域,標記為可被再分配。malloc 和 free是在heap中,記錄了分配的記憶體起始位址和長度。實現過程,參照支援c庫的os系統。struct example attribute packed 與struct example attribute pack...