char data[0](0长数组)用法

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

但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:下面看一段C程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _Info

{
    int i;
    char data[0];

}Info;

 

int main(int argc, char* argv[])

{
    printf("%d/n",sizeof(Info));

    return 0;

}

程序的执行结果是:4。整数i就占了4个字节,这表明data没有占用空间。

1. 含义:此处,data是一个数组名,该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。

2. 用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体,如缓冲区,数据包等等。

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

### 获取 `unsigned char` 指针数组度 在 C/C++ 中,要获取 `unsigned char*` 类型指针数组的实际度,通常有两种主要方式: #### 方法一:使用 `sizeof` 当数组大小已知且是在编译期确定的情况下,可以通过 `sizeof` 运算符来计算整个数组占用的空间字节数除以单个元素所占空间得到元素数量。 ```c++ #include <iostream> int main(){ unsigned char data[] = {'a', 'b', 'c'}; size_t length = sizeof(data) / sizeof(unsigned char); std::cout << "Length of array is: " << length << std::endl; } ``` 这种方法适用于静态分配的数组,在运行时动态创建的数组不适用此法[^2]。 #### 方法二:遍历直到遇到终止标志 如果是指向字符串或其他具有特定结束标记的数据结构,则应通过循环读取数据直至找到该标记为止。对于普通的 `unsigned char*` 数组而言,如果没有预设结尾条件,则无法仅靠指针本身得知其实际尺寸;此时需额外传递表示有效范围的信息给接收方处理逻辑。 ```c++ // 假定有一个以 '\0' 结束的 unsigned char 字符串 const unsigned char str[] = {'H','e','l','l','o','\0'}; size_t i=0; while(str[i]!='\0'){ ++i; } std::cout<<"The string length is:"<<i<<std::endl; ``` 上述例子展示了如何利用 `\0` 来作为字符串结束符从而间接获得度[^1]。 然而,如果是纯粹由数值构成而无特殊终结符的 `unsigned char*` 数组,最可靠的做法还是让调用者显式指定数组的有效区间或者采用容器类如 `std::vector<unsigned char>` 自动管理内存及其边界[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值