You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为已分配内存的指针结构体成员设置值?

结构体成员赋值及内存分配修正方案

你当前的代码存在严重问题:给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:42:49