结构体的不定长数组,用起来就是这么爽

11 篇文章 0 订阅
文章介绍了在C语言中如何实现结构体的不定长数组,主要通过两种方式:结构体指针和长度为0的数组。详细展示了使用结构体指针初始化,以及利用calloc动态分配内存来设置长度为0的数组的结构体。在示例代码中,创建了一个包含intsize、intnums和charbuf[0]的结构体,然后动态分配内存并填充数据。
摘要由CSDN通过智能技术生成

结构体的不定长数组

结构体数组不定长的做法,有两种
第一种: 指针
第二种:长度为0的数组

1. 结构体的数组指针

特点

  1. 结构体初始化时,可以是结构体指针,如struct tag_info *pInfo = NULL; 也可以是结构体变量, 如 struct tag_info Info = {‘\0’};
  2. 使用结构体里面的指针时,必须申请内存,进行初始化

2. 结构体长度为0的数组

特点

  1. 结构体初始化时,必须是结构体指针;
  2. 长度为0的数组必须是放在结构体的最末尾
  3. 不占用结构体的大小,即sizeof结构体不包含buf[0]的大小

3. 结构体长度为0的数组

3.1 结构体如下定义:
typedef struct tag_info
{
	int size;
	int nums;
	char buf[0];
}Info_t;
3.2 结构体初始化:
Info_t *pinfo = (Info_t*)calloc(1, sizeof(Info_t)+128);

	if(pinfo == NULL)
	{
		printf("calloc for info.buf failed\r\n");
		return -1;
	}

	pinfo->size = 128;  // 128 为 buf[0]的长度
	pinfo->nums = 1;

4. 完整例子

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>

typedef struct tag_info
{
	int size;
	int nums;
	char buf[0];
}Info_t;


int main(int argc, char const argv[])
{
	Info_t *pinfo = (Info_t*)calloc(1, sizeof(Info_t)+128);

	if(pinfo == NULL)
	{
		printf("calloc for info.buf failed\r\n");
		return -1;
	}

	pinfo->size = 128;
	pinfo->nums = 1;

	memset(pinfo->buf, '\0', pinfo->size);
	snprintf(pinfo->buf, pinfo->size, "hello world\r\n");

	printf("pinfo->buf: %s\r\n", pinfo->buf);


	free(pinfo);
	pinfo = NULL;
	
	return 0;

}

5. 例子结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值