C语言结构体中数组的初始化与赋值问题
C语言结构体中数组的初始化与赋值问题
兄弟,你这段代码里踩了C语言柔性数组的坑啦!先给你捋明白问题出在哪,再给你说怎么改。
你定义的TEST结构体最后那个int arrayInStruct[]是C99引入的柔性数组成员,它的特点是:结构体本身的大小不包含这个数组的空间,而且这种结构体不能直接在栈上声明普通变量(就像你写的TEST test1;),因为这样分配的空间只有int v的大小,后面的数组根本没地方放,强行赋值肯定会越界出问题。
那正确的做法应该是用动态内存分配,给结构体和数组一起申请足够的空间,具体步骤看下面:
正确实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int v; int arrayInStruct[]; // 柔性数组成员 } TEST; void CorrectCode() { int array[5] = {1,2,3,4,5}; // 1. 计算需要分配的总内存:结构体本身大小 + 数组元素所需空间 size_t total_size = sizeof(TEST) + sizeof(int) * 5; // 2. 动态分配内存,记得检查分配结果 TEST* test1 = (TEST*)malloc(total_size); if (test1 == NULL) { perror("内存分配失败"); return; } // 给结构体的普通成员赋值 test1->v = 10; // 示例值,你可以按需求改 // 把外部数组的元素拷贝到结构体的柔性数组里 // 方法一:用memcpy批量拷贝,效率更高 memcpy(test1->arrayInStruct, array, sizeof(array)); // 方法二:循环逐个赋值,和你原本的思路一致 // for(int i = 0; i < 5; i++){ // test1->arrayInStruct[i] = array[i]; // } // 验证结果 printf("test1->v = %d\n", test1->v); printf("arrayInStruct的元素:"); for(int i = 0; i <5; i++){ printf("%d ", test1->arrayInStruct[i]); } printf("\n"); // 用完记得释放内存,避免内存泄漏 free(test1); } int main() { CorrectCode(); return 0; }
额外要注意的点
- 柔性数组的结构体只能通过
malloc/calloc动态分配,绝对不能用TEST test1;这种栈上声明的方式 - 分配内存时一定要把数组的总空间算进去,不然数组部分没有存储空间
- 必须检查
malloc的返回值,防止内存分配失败导致后续操作崩溃 - 使用完动态分配的结构体后,一定要用
free释放内存
备注:内容来源于stack exchange,提问作者Kanwar
相关产品推荐
相关产品推荐

