C語言不定長消息之柔性數組

導語:C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。下面我們來看看C語言不定長消息之柔性數組,希望對大家有所幫助。

C語言不定長消息之柔性數組

C語言不定長消息之柔性數組:柔性數組:數組大小待定的數組。C語言中結構體最後一個元素可以是大小未知的數組。C語言可以由結構體產生柔性數組。

柔性數組的結構如何只能堆上生成,柔性數組是C99的擴展,簡而言之就是一個在struct結構裏的.標識佔位符(不佔結構struct的空間)

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

一般的做法是定義一個char*類型的指針,然後指定其長度,代碼如下:

1234typedef struct{ unsigned len; char* pData; }Msg;

使用時:

12345678char 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", m->len, m->pData);

有沒有覺得時機上char* pData很多餘呢?

因爲數據時機的存儲位置在m+1,我們可以直接得到這個指針,而不需要重新定義一個char* pData來報錯這個位置。

這樣帶來了另一個問題就是,訪問不方便,我們不能用結構體成員的方式來訪問了,可以使用柔性數組,且看:

1234typedef struct{ unsigned len; char data[]; }Message;

使用起來就是這樣

12345Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char)); msg->len = len; memcpy(msg->data, str, len); printf("%d, %s", msg->len, msg->data); free(msg);

來分完整代碼對比下:

123456789101112131415161718192021222324252627282930313233343536373839404142typedef struct{ unsigned len; char* pData; }Msg; typedef struct{ unsigned len; char data[]; }Message; // test for 0 size array #include <stdio.h> #include <stdlib.h> #include <string.h> #include "array0.h" int main() { 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", m->len, m->pData); free(m); // 柔性數組 Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char)); msg->len = len; memcpy(msg->data, str, len); printf("%d, %s", msg->len, msg->data); free(msg); system("pause"); return 0; }</string.h></stdlib.h></stdio.h>

附自己測試代碼

12345678910111213141516171819202122232425262728293031323334#include <iostream> using namespace std; typedef struct{ unsigned len; char* pData; }Msg; typedef struct{ unsigned len; char pData[]; }Msg1; int main(void) { Msg m; cout << sizeof(m) << endl; //16 cout << &m << endl; // x cout << &() << endl; //x cout << &(a) << endl; //x+8 // cout << "-----" << endl; Msg1 m1; cout << sizeof(m1) << endl; //4 cout << &m1 << endl; // x cout << &() << endl; //x cout << &(a) << endl; //x+4 return 0; }</iostream>

結果