亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言 百分網(wǎng)手機站

C語言不定長消息之柔性數(shù)組

時間:2020-09-26 19:53:29 C語言 我要投稿

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