C语言 百分网手机站

C语言不定长消息之柔性数组

时间:2020-09-26 19:53:29 C语言 我要投稿

C语言不定长消息之柔性数组

  导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看C语言不定长消息之柔性数组,希望对大家有所帮助。

  C语言不定长消息之柔性数组:柔性数组:数组大小待定的数组。C语言中结构体最后一个元素可以是大小未知的数组。C语言可以由结构体产生柔性数组。

  柔性数组的结构如何只能堆上生成,柔性数组是C99的扩展,简而言之就是一个在struct结构里的'标识占位符(不占结构struct的空间)

  在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的。

  一般的做法是定义一个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很多余呢?

  因为数据时机的存储位置在m+1,我们可以直接得到这个指针,而不需要重新定义一个char* pData来报错这个位置。

  这样带来了另一个问题就是,访问不方便,我们不能用结构体成员的方式来访问了,可以使用柔性数组,且看:

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);          
   // 柔性数组          
   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>          

  结果

【C语言不定长消息之柔性数组】相关文章:

C语言数组方法10-06

C语言数组是什么09-30

C语言二维数组10-01

C语言数组与指针详解11-05

C语言指针数组的概念10-22

C语言数组元素的查询10-20

C语言数组知识点总结10-05

C语言字符数组和字符串10-02

C语言二维数组怎么写好10-18