C语言中的0长数组

1、0长数组
解释:0长数组通常以变长结构体的形式存在特殊的应用场合,目的是解决c语言中数组在声明时必须指定分配大小的问题。在一个存在0长数组的变长结构体中,0长数组在给结构体开辟空间的时候是不占用任何结构体空间的,但它又可以像指针一样指向一块内存空间。可以通过0长数组的数组名来访问这块空间。

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

struct buffer{
char c[0];
int len;
char a[0];
char b[0];
};

int main(void) {
struct buffer * buf;
buf = (struct buffer *) malloc(sizeof(struct buffer) + 20);
buf->len = 20;
strcpy(buf->a, “hello yaoyuantao!”);
printf(“buf len is %d\n”, sizeof(struct buffer));
printf(“buf->c is %s\n”, buf->c);
printf(“buf->a is %s\n”, buf->a);
printf(“buf->b is %s\n”, buf->b);
free(buf);
return 0;
}

output:
buf len is 4 说明0长数组没有占用结构体的任何内存
buf->c is 从这里向下三个输出数据说明malloc分配的除了结构体以外的内存被变长数组名所指向,并且编译器规定结构体靠后的0长数组才能指向开辟的内存区,如果0长数组后包括了其他数据类型,则不会指向开辟的任何内存区域。
buf->a is hello yaoyuantao!
buf->b is hello yaoyuantao!
0长数组相较于指针有什么优势?
要回答这个问题首先要考虑数组和指针有什么区别?简单来说数值是内存中分配的一块连续的内存空间,在系统最底层编译器就是这样编译的,而指针其实还是一个变量与普通的数据类型(int char 等)相似也是保存数据用的,只是它的特殊在于它保存的是一个内存地址,而这个内存地址也就是真实数据(当然也许还是一个地址)的存储位置(线性地址,逻辑地址,物理地址),也就是说指针存储变量,数组存储一堆变量(1个或n个)。
0长数组是指我们把数组中的1个或n个变量全都删掉,那么这个数组也就不再占用任何内存空间,而唯一剩下的就是一个数组名(数组名不占任何内存空间)。由此可以看出指针至少占用一个保存地址数据的空间,而数组名不占用空间,当编译器编译代码的时候就会自动的将结构体后面的内存区域与结构体靠后的0长数组关联,便可以实现指针的效果。结构体中使用0长数组0长数组是不占结构体空间的,而指针要占一个空间(通常4个字节),这样的结构体不冗余,也更加优雅。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言,获取数组度有多种方法。一种常用的方法是使用sizeof运算符。但是要注意的是,当数组作为参数传递给函数时,无法通过传递数组名参数来获取数组度,因为在函数数组名会被解释为指针。所以在函数内部使用sizeof运算符来计算数组度是不可行的。 另一种方法是通过定义一个已知度的数组,并逐个打印数组元素来获取数组度。假设我们定义了一个知乎数组,并打印数组元素,对于未传入数据的部分我们执行打印操作。这样可以通过循环遍历数组来获取数组度。 还有一种方法是通过使用字符串函数库的strlen函数来获取数组度。这种方法比较适用于字符数组或以'\0'结尾的字符串。通过调用strlen函数并传入数组名作为参数,可以得到数组的实际度。但是要注意的是,如果通过数组下标来一一赋值,就无法使用这种方法来获取数组度了。 综上所述,获取数组度的方法包括使用sizeof运算符、通过定义已知度的数组打印元素来获取度,以及使用strlen函数(适用于字符数组)。具体方法的选择取决于具体的应用场景和需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言 怎么获取数组度(sizeof)通俗易懂](https://blog.csdn.net/qq_43290288/article/details/114640639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C语言数组度](https://blog.csdn.net/xinzhilinger/article/details/109004193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值