`

C/C++柔性数组 char[0]

 
阅读更多

在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。

但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:

StructPacket

{

Int state;

Int len;

Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持

};

 

首先对0长数组做一个解释:

用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体。

用法 :在一个结构体的最后 ,申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配

 

请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

 

对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:

Struct Buffer

{

Int len;

Char cData[0];

};

这样的变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发送1024字节的数据,如果用定长包,假设定长包的长度为2048,就会浪费1024个字节的空间,也会造成不必要的流量浪费

Struct packet

{

    char data[2048];

}

packet p;

memcpy(p.data,"1024 datas.........",1024)

send(socket,(char*)&p,sizeof(p));

由于考虑到数据的溢出,变长数据包中的data数组长度一般会设置得足够长足以容纳最大的数据,因此packet中的data数组很多情况下都没有填满数据,因此造成了浪费,而如果我们用变长数组来进行封包的话,就不会造成浪费(最多会造成4个字节的浪费,包头的int型的len不属于数据因此算是浪费),如前面的Buffer结构体,假如我们要发送1024个字节,我们如何构造这个数据包呢:

char *tmp = (char*)malloc(sizeof(Buffer)+1024) //这句代码的作用是申请一块连续的内存空间,这块内存空间的长度是Buffer的大小加上1024数据的大小,由两部分构成,sizeof(Buffer)和1024,如果仔细观察的话,会发现这种申请方法比第一种多了一段sizeof(Buffer)大小的空间,原因何在?如下

Buffer *p = (Buffer*)tmp;

p->len = 1024;

memcpy(p.cData,"1024 datas............",1024);

如上三行代码,首先做一个强制类型转换,Buffer类型的指针指向内存的起始位置,这段内存要分两部分使用,前部分4个字节p->len,作为包头(就是多出来的那部分),这个包头是用来描述紧接着包头后面的数据部分的长度,这里是1024,所以前四个字节赋值为1024(既然我们要构造不定长数据包,那么这个包到底有多长呢,因此,我们就必须通过一个变量来表明这个数据包的长度,这就是len的作用),而紧接其后的内存是真正的数据部分,通过p->cData定位到该部分的起始地址,最后,进行一个memcpy()内存拷贝,把要发送的数据填入到这段内存当中,最后:

send(socket,p,sizeof(Buffer)+1024);发送数据

分享到:
评论

相关推荐

    C/C++ 避免数组越界的方法

    C/C++ 避免数组越界的方法 C/C++ 中的数组越界是一种常见的错误,它可能会导致程序崩溃或破坏其他变量的数据。为了避免数组越界,程序员需要预先推断数组的大小和边界,并在访问数组时进行严格的边界检查。 首先...

    C/C++中数组与指针的关系

    ### C/C++中数组与指针的关系 #### 1. 指针类型及其运算符 在C/C++中,指针是一种特殊的变量类型,它主要用于存储其他变量或数组的地址。指针变量的定义通常包含基类型和星号(*)。例如: - `int *ptr;` 定义了一...

    C/C++中多维数组指针作为函数参数传递程序

    C/C++中多维数组指针作为函数参数传递程序 在 C++ 中,多维数组指针作为函数参数传递是非常常见的编程技术。本文将详细介绍如何在 C/C++ 中将多维数组指针作为函数参数传递,並对相关知识点进行详细解释。 多维...

    C++实现数组类

    在C++编程中,数组是一种基础且重要的数据结构,它允许程序员存储一组具有相同类型的数据。数组类的实现是将数组的功能封装在一个类中,提供更方便、更安全的访问和操作方式。以下是对`C++实现数组类`这一主题的详细...

    图像到 C/C++ 数组转换器:此程序将 BMP/TIFF/JPG/PNG 文件转换为单色图像和嵌入的 C/C++ 字节数组。-matlab开发

    该程序将 BMP/TIFF/JPG/PNG 文件转换为嵌入的 C/C++ 字节数组。 当您想在显示器上显示单色图像时,这非常有用。 它在数据数组生成之前将您的图像转换为单色。 源图像中较暗的颜色将产生“开”像素,而较亮的颜色将...

    C++动态数组类模板

    动态数组类模板Array C++ //数组类模板声明 template class Array { public: Array(int sz = 50); Array(const Array<T> &A); ~Array(void); Array<T>& operator = (const Array<T> &rhs;); //重载=,使数组...

    C/C++中传递多维数组的各种方法

    在 C/C++ 编程语言中,处理多维数组是一个常见的需求,尤其是在进行科学计算、数据处理以及游戏开发等领域。多维数组为我们提供了表示表格数据、矩阵、图像等复杂结构的便捷方式。然而,如何高效地在函数间传递多维...

    c/c++中文帮助文档(API)

    C++是C语言的扩展,引入了面向对象编程的概念。在编程过程中,理解并有效地使用库函数是至关重要的,因为它们提供了标准功能,可以帮助开发者节省时间,减少错误,并提高代码的可读性和可维护性。 API,全称为...

    C++ 上课/复习ppt 数组与向量.pptx

    C++ 上课/复习ppt 数组与向量.pptx

    C/C++ 动态数组的创建的实例详解

    C/C++ 动态数组的创建的实例详解 动态数组是一种可以在运行时动态地分配内存的数组类型。在 C/C++ 语言中,动态数组可以使用指针和 malloc 函数来实现。下面我们将详细介绍动态数组的创建和使用。 一、动态数组的...

    c/c++帮助文档中文

    C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域。这份"c/c++帮助文档中文"提供了丰富的中文资源,帮助开发者深入理解和掌握这两种语言。 C语言是最早由Dennis Ritchie在贝尔实验...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在C++中,你可能需要提供一个辅助函数来处理Java传递过来的一维数组,转换为C++的二维数组格式。 此外,对于大型数据结构,考虑到性能问题,可能需要考虑使用直接内存映射(Direct Memory Mapping)或者自定义类型...

    C#调用C/C++DLL收取中文字符处理

     C/C++字符串一般通过char* 或wchar_t*来表示,char*表示的是ANSCII字符串, wchar_t*表示Unicode字符串,Unicode字符串在C/C++中一个字符占用两个字节,ANSII字符串一个字符占用一个字节(中文占用两个字节), ...

    C++指针 数组 内存释放.docx

    C++指针数组内存释放 C++指针是一种基本变量,包含一个实际的数据,该数据代表一个可以找到实际信息的内存地址。指针是C++编程中非常重要的概念,许多程序和思想依靠指针作为他们设计的基础。 定义指针变量 定义...

    数组中重复的数字(C语言/C++)

    数组中重复的数字(C语言/C++) 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字...

    学生成绩管理系统 C语言 C++ 详细注释 可运行 结构体数组 链表 课程设计

    在这个案例中,系统使用了两种不同的方法来实现:结构体数组法和链表法,这两种都是在C语言和C++中处理数据的有效方式。下面将详细讨论这两个方法以及相关的编程知识点。 1. **结构体数组法**: 在`学生成绩管理...

    C/C++指针经典资料大全

    在IT领域,C和C++语言中的指针是至关重要的概念,它们是程序设计的基础,也是许多高级技术的基石。本资源包“C/C++指针经典资料大全”收集了多部经典教材,旨在帮助学习者深入理解并掌握指针的使用。 1. **指针基础...

    C/C++笔试题库 (整理版)

    在C/C++语言中,数组的下标范围是从0到n-1,其中n是数组的长度。当数组的下标超过了这个范围时,会导致数组越界问题。例如,在给定的代码中,数组A的下标范围是从0到MAX-1,当i循环到MAX时,A[255]=255;这句代码本身...

    C/C++中获取数组长度的方法示例

    学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / ...

Global site tag (gtag.js) - Google Analytics