欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

C語言

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

時間:2025-02-13 09:42:58 C語言 我要投稿
  • 相關(guān)推薦

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

  導(dǎo)語:C語言的設(shè)計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(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)里的標識占位符(不占結(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ù)組與函數(shù)10-23

C語言數(shù)組教程08-31

什么是C語言數(shù)組10-03

C語言數(shù)組與指針詳解08-15

C語言數(shù)組的定義及引用08-05

C語言數(shù)組方法08-06

C語言數(shù)組元素的查詢08-02

C語言指針數(shù)組的概念07-19

C語言數(shù)組入門學(xué)習(xí)10-22