C語言變長訊息定義 柔性陣列

2021-06-28 12:17:25 字數 1179 閱讀 9164

在遊戲前後端交換的過程中,經常會用到變成的訊息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。

一般的做法是定義乙個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這個未知長...