C語言不定長訊息之柔性陣列

2021-12-29 19:58:58 字數 1304 閱讀 3183

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...