c++如何定义二维数组结构体_你了解C语言的“柔性数组”吗?看完你就知道了...

8a4b83375423e34c2dea194586f792d8.png

C语言
首先我们来看一道面试题
如果你还不能很快就得出答案,那可以通过本次的介绍彻底的了解一下“柔性数组”参考答案会在文末给出哦
开发C代码时,经常见到如下类型的结构体定义:
typedef struct list_t{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
最后一行char data[0];的作用是()
A、方便管理内存缓冲区
B、减少内存碎片化
C、标识结构体结束
D、没有作用柔性数组(Flexible Array)是C99引入的一个新特性
这个特性允许你在定义结构体的时候创建一个空数组,而这个数组的大小可以在程序运行的过程中根据你的需求进行更改特别注意的一点是:这个空数组必须声明为结构体的最后一个成员,并且还要求这样的结构体至少包含一个其他类型的成员上面的简单介绍可能还是没能让你足够了解什么是“柔性数组”,以及具体又该如何使用,下面就通过具体的例子进行解释:
现在我们需要进行学生的一些基本信息的统计,假设我们定义了如下的一个结构体:
typedef struct
{
int stuID;
int name;
char address[30];
}ST_STU_INFO
可以看到在最后存储“地址(address)“的结构体中,我们申请了一个包含30个字节的数组,如果我们存储的时候只存入较短的地址,以上的定义的是没问题的,但需要存入的地址信息超出了30个字节,程序很可能就崩掉了,就像下面这样

fdc8984d8b13d043e3fd3b3d9edccfea.gif

C语言
这时候具有主角光环的柔性数组就可以登场啦!
我们在结构体中定义一个柔性数组,这样可以确保能够在程序运行过程中“动态”的进行结构体的扩展,是有点动态的感觉了呀!
具体代码如下:
#include
#include
#include
//存放学生信息结构体
typedef struct{
int stuID;
int age;
char address[];
}ST_STU_INFO,*pStuInfo;
//为结构体分配内存
pStuInfo ComposeStuInfo( int stuID,int age, const char *paddress)
{
pStuInfo ptmpInfo = malloc(sizeof(*ptmpInfo) + sizeof(char) * strlen(paddress) + 1);
if(ptmpInfo != NULL){
ptmpInfo->stuID = stuID;
ptmpInfo->age = age;
strcpy(ptmpInfo->address, paddress);
}
return ptmpInfo;
}
// 打印学生信息
void printStuInfo(pStuInfo ptmpInfo)
{
printf("stuID : %d age : %d Address: %snSize of Struct:%dnn",
ptmpInfo->stuID,ptmpInfo->age,ptmpInfo->address,sizeof(*ptmpInfo));
}
//主程序
int main()
{
pStuInfo CodeLab = ComposeStuInfo(100013,20, "Tencent Building, Central District, High-tech Park, Nanshan District, Shenzhen");
if(CodeLab != NULL){
printStuInfo(CodeLab);
free(CodeLab);
}
pStuInfo subCodeLab = ComposeStuInfo(200013,23, "Tencent Building");//Tencent Building里面的大佬个个都很厉害吧~~~
if(subCodeLab != NULL){
printStuInfo(subCodeLab);
free(subCodeLab);
}
return 0;
}
运行之后得到结果如下:
stuID : 100013 age : 20 Address: Tencent Building, Central District, High-tech Park, Nanshan District, Shenzhen
Size of Struct:8
stuID : 200013 age : 23 Address: Tencent Building
Size of Struct:8
从结果输出可以看到,我们成功使用了不同长度的地址,当然程序也不会出现文章开头那样崩溃的情况
此外,虽然我们对结构体进行了如下的初始化
pStuInfo ptmpInfo = malloc(sizeof(*ptmpInfo) + sizeof(char) * strlen(paddress) + 1);
但是却在输出中可以看到结构体的大小并没有因此而发生变化Size of Struct:8
ST_STU_INFO结构体的大小是8, 两个int型变量大小刚好为8,也就是说结构体中的数组并没有占用内存,这就是从0开始,却可以拓展的柔性数组针对柔性数组这一不占用内存的特性,可以构造出内存缓冲区,同时由于是使用多少就申请多少,也起到了减少内存碎片化的作用,所以文章开头的面试题答案是A和B而对于选项C而言,恰恰相反的是,柔性数组并不是标识结构体结束,而是作为结构体的一种拓展
同时也可以理解为柔性数组为结构体的一个偏移地址,这使得结构体的大小可以进行动态的变化最后可能还是会有疑问,这和直接使用指针有啥区别呢?
像下面这样:
typedef struct{
int stuID;
int age;
char *pAddress;
}ST_STU_INFO;
首先柔性数组不占用内存,而指针则不然,此外柔性数组在使用上是直接访问,形式上更加直观,而指针需要经过声明再进行动态分配内存,在效率上和柔性数组相比也稍微低一些,其实在Linux内核代码中有较多的柔性数组的使用,感兴趣的可以去深入的了解一下。

844fb877ed6e977665b683036dc64522.png

C语言写在最后:
小伙伴们在学习的过程中难免会遇到很多的困难,有的是初学不知道如何入手,亦或是想要继续提升自己,小编为了帮助大家解决学习问题,大家可以点击上方我的头像私信我发送:“学习”两个字,我将会针对性的帮助解答你学习上的问题和发送你学习资料哦,大家一起进步!
好了,就讲到这里吧,感谢耐心阅读!

“我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。全球最大的C/C++、编程爱好者的聚集地就在我这里!欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习!”

关注我,带你遨游代码世界!编程学习企鹅裙:633731447

98c4cc44f6937a8e6e747164edc38143.png
### 回答1: 要动态创建二维结构体数组,可以使用以下步骤: 1. 定义结构体类型。 2. 使用动态内存分配分配二维数组的空间。 3. 访问和操作数组元素。 4. 释放内存。 以下是一个示例代码,其中包括创建和释放二维结构体数组整过程: ``` #include <stdio.h> #include <stdlib.h> // 定义结构体类型 struct myStruct { int a; char b; }; int main() { int rows = 2; int cols = 3; // 使用动态内存分配分配二维数组的空间 struct myStruct **arr = malloc(rows * sizeof(struct myStruct *)); for (int i = 0; i < rows; i++) { arr[i] = malloc(cols * sizeof(struct myStruct)); } // 访问和操作数组元素 arr[0][0].a = 1; arr[0][0].b = 'a'; arr[1][2].a = 2; arr[1][2].b = 'b'; // 打印数组元素 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("arr[%d][%d].a = %d, arr[%d][%d].b = %c\n", i, j, arr[i][j].a, i, j, arr[i][j].b); } } // 释放内存 for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr); return 0; } ``` 在这个例子中,我们首先定义了一个结构体类型 `myStruct`。然后,我们使用动态内存分配分配二维数组的空间,并访问和操作数组元素。最后,我们释放数组所占用的内存。 ### 回答2: 在C语言中,我们可以通过动态创建二维结构体数组来满足特定需求。首先,我们需要先定义结构体的类型及其成员变量。例如,假设我们有一个表示学生信息的结构体类型student,包含学生姓名 name 和学生年龄 age。 然后,我们可以使用malloc函数动态分配内存创建二维结构体数组。以创建一个有row行、col列的二维结构体数组为例,我们可以使用以下代码来实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct student{ char name[20]; int age; } Student; int main() { int row, col; printf("请输入要创建的二维结构体数组的行数和列数:"); scanf("%d%d", &row, &col); // 动态分配内存 Student **students = (Student **)malloc(row * sizeof(Student *)); for (int i = 0; i < row; ++i) { students[i] = (Student *)malloc(col * sizeof(Student)); } // 初始化结构体数组 for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("请输入第%d行第%d列学生的姓名和年龄:", i + 1, j + 1); scanf("%s%d", students[i][j].name, &(students[i][j].age)); } } // 输出结果 for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("第%d行第%d列学生的姓名:%s,年龄:%d\n", i + 1, j + 1, students[i][j].name, students[i][j].age); } } // 释放内存 for (int i = 0; i < row; ++i) { free(students[i]); } free(students); return 0; } ``` 以上代码首先根据输入的行数和列数动态分配内存创建二维结构体数组。然后,通过嵌套的for循环来初始化每个结构体的成员变量,并输出结果。最后,需要记得释放通过malloc函数分配的内存,以防止内存泄漏。 ### 回答3: 在C语言中,动态创建二维结构体数组可以通过以下步骤进行: 1. 首先,需要定义一个结构体,包含二维数组所需的属性。例如,假设我们要创建一个名为Student的结构体,包含两个属性,分别是姓名和年龄,可以定义如下: ``` typedef struct { char name[100]; int age; } Student; ``` 2. 然后,需要确定需要创建二维数组的行数和列数。例如,假设要创建一个3行2列的二维结构体数组,可以定义如下: ``` int rows = 3; int cols = 2; ``` 3. 接下来,可以使用动态内存分配函数malloc来为二维结构体数组分配内存空间。需要计算总的元素数量,并根据结构体的大小动态分配内存。例如,可以使用如下代码分配内存: ``` Student** students = malloc(rows * sizeof(Student*)); for (int i = 0; i < rows; i++) { students[i] = malloc(cols * sizeof(Student)); } ``` 4. 现在,我们可以通过访问二维结构体数组的元素来操作数据。例如,可以使用下标访问和修改数组中的元素,如下所示: ``` strcpy(students[0][0].name, "张三"); students[0][0].age = 20; strcpy(students[1][0].name, "李四"); students[1][0].age = 22; strcpy(students[2][0].name, "王五"); students[2][0].age = 25; ``` 5. 最后,使用二维结构体数组后,需要释放之前分配的内存空间,以免造成内存泄漏。可以使用free函数释放内存,如下所示: ``` for (int i = 0; i < rows; i++) { free(students[i]); } free(students); ``` 通过以上步骤,我们可以动态创建二维结构体数组,并进行操作和释放内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值