如何为已分配内存的指针结构体成员设置值?
结构体成员赋值及内存分配修正方案
你当前的代码存在严重问题:给val[i].choices分配内存时,val[i].num_choice未初始化,是随机垃圾值,这会导致内存分配大小错误甚至程序崩溃。正确的操作顺序应该是先设置num_choice,再分配choices内存,最后给数组赋值。
单结构体元素赋值示例(以第0个元素为例)
如果要将第0个结构体的num_choice设为2,choices设为[0,1],代码如下:
// 1. 设置num_choice的值 val[0].num_choice = 2; // 2. 为choices分配对应大小的内存 val[0].choices = malloc(val[0].num_choice * sizeof(int)); if (val[0].choices == NULL) { exit(1); } // 3. 给choices数组赋值 val[0].choices[0] = 0; val[0].choices[1] = 1;
批量处理所有4个结构体元素
如果要给n=4的所有结构体都设置num_choice=2,choices=[0,1],可以用循环实现:
val_t *val = malloc(n * sizeof(val_t)); if (val == NULL) { exit(1); } for (int i = 0; i < n; ++i) { // 先设置num_choice val[i].num_choice = 2; // 分配choices内存 val[i].choices = malloc(val[i].num_choice * sizeof(int)); if (val[i].choices == NULL) { // 内存分配失败时,释放已分配内存避免泄漏 for (int j = 0; j < i; ++j) { free(val[j].choices); } free(val); exit(1); } // 给choices数组赋值 val[i].choices[0] = 0; val[i].choices[1] = 1; }
注意事项
- 如果原代码已经用未初始化的
num_choice错误分配了choices内存,需要先调用free(val[i].choices)释放,再重新分配,避免内存泄漏。 - 程序结束前,要先循环释放每个
val[i].choices,再释放val本身,清理所有动态分配的内存。
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

