C語言不定長消息之柔性數(shù)組
導(dǎo)語:C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。下面我們來看看C語言不定長消息之柔性數(shù)組,希望對大家有所幫助。
C語言不定長消息之柔性數(shù)組:柔性數(shù)組:數(shù)組大小待定的數(shù)組。C語言中結(jié)構(gòu)體最后一個元素可以是大小未知的數(shù)組。C語言可以由結(jié)構(gòu)體產(chǎn)生柔性數(shù)組。
柔性數(shù)組的結(jié)構(gòu)如何只能堆上生成,柔性數(shù)組是C99的擴展,簡而言之就是一個在struct結(jié)構(gòu)里的'標(biāo)識占位符(不占結(jié)構(gòu)struct的空間)
在游戲前后端交換的過程中,經(jīng)常會用到變成的消息體,因為有的內(nèi)容的大小是位置的,例如一條微博,微博的內(nèi)容大小是未知的。
一般的做法是定義一個char*類型的指針,然后指定其長度,代碼如下:
1 2 3 4 | typedef struct{ unsigned len; char * pData; }Msg; |
使用時:
1 2 3 4 5 6 7 8 | 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); |
有沒有覺得時機上char* pData很多余呢?
因為數(shù)據(jù)時機的存儲位置在m+1,我們可以直接得到這個指針,而不需要重新定義一個char* pData來報錯這個位置。
這樣帶來了另一個問題就是,訪問不方便,我們不能用結(jié)構(gòu)體成員的方式來訪問了,可以使用柔性數(shù)組,且看:
1 2 3 4 | typedef struct{ unsigned len; char data[]; }Message; |
使用起來就是這樣
1 2 3 4 5 | 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); |
來分完整代碼對比下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | typedef 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); // 柔性數(shù)組 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> |
附自己測試代碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #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 << &(m.len) << endl; //x cout << &(m.pData) << endl; //x+8 // cout << "-----" << endl; Msg1 m1; cout << sizeof(m1) << endl; //4 cout << &m1 << endl; // x cout << &(m1.len) << endl; //x cout << &(m1.pData) << endl; //x+4 return 0 ; }</iostream> |
結(jié)果
【C語言不定長消息之柔性數(shù)組】相關(guān)文章:
C語言數(shù)組方法10-06
C語言數(shù)組是什么09-30
C語言二維數(shù)組10-01
C語言數(shù)組與指針詳解11-05
C語言指針數(shù)組的概念10-22
C語言數(shù)組元素的查詢10-20
C語言數(shù)組知識點總結(jié)10-05
C語言字符數(shù)組和字符串10-02
C語言二維數(shù)組怎么寫好10-18