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

C语言结构体数组中字符串字段值异常问题求助

问题分析与解决方案:结构体指针指向同一内存导致的覆盖问题

哥们,你遇到的这个问题其实是C语言新手很容易踩的一个坑——所有结构体实例的name和address指针都指向了同一个局部数组input,咱们一步步拆解来看:

问题根源

你定义的input是栈上的局部数组(char input[30];),每次循环里的sprintf都是往这块固定的内存地址里写内容。然后你把input的地址赋值给structArray[i].name和structArray[i].address,相当于所有结构体的这两个指针都指向了同一块内存空间。

循环到最后一次时,input里的内容被改成了"addr_2",所以当你后续打印所有结构体的name和address时,它们都会读取这块内存的最终值,自然全是addr_2了。

修复方案

要解决这个问题,你需要给每个结构体的name和address分配独立的内存空间,这样每次写入的内容就不会互相覆盖。常用的两种方法:

方法1:使用strdup(推荐,简洁)

strdup会自动分配足够的内存来复制字符串,然后返回指向新内存的指针。注意:Windows平台下标准库没有strdup,可以用_strdup替代。

修改后的循环赋值代码:

for (int i = 0; i < nStructs; i++) {
    structArray[i].id = i;
    sprintf(input, "name_%d", i);
    // 分配内存并复制字符串
    structArray[i].name = strdup(input);
    sprintf(input, "addr_%d", i);
    structArray[i].address = strdup(input);
}

方法2:手动malloc + strcpy

如果你想更明确地控制内存分配,可以手动调用malloc分配内存,再用strcpy复制内容:

for (int i = 0; i < nStructs; i++) {
    structArray[i].id = i;
    sprintf(input, "name_%d", i);
    // 分配足够存下字符串+结束符的内存
    structArray[i].name = malloc(strlen(input) + 1);
    if (structArray[i].name == NULL) {
        // 内存分配失败的处理逻辑
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    strcpy(structArray[i].name, input);
    
    sprintf(input, "addr_%d", i);
    structArray[i].address = malloc(strlen(input) + 1);
    if (structArray[i].address == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    strcpy(structArray[i].address, input);
}

重要补充:内存泄漏修复

你现在补充了free(structArray);,但还要记得每个结构体里的name和address指针指向的内存也需要单独释放,否则会造成内存泄漏。在free(structArray);之前添加循环:

// 先释放每个结构体内部的动态内存
for (int i = 0; i < nStructs; i++) {
    free(structArray[i].name);
    free(structArray[i].address);
}
free(structArray);

调试小技巧(针对Visual Studio)

在VS里调试时,你可以在监视窗口输入structArray,3(3是你的数组长度),这样就能一次性看到整个数组的所有元素。展开每个元素后,你会发现所有name和address的地址都是完全相同的,这就能直观地看出它们指向了同一块内存,帮你快速定位问题。

内容的提问来源于stack exchange,提问作者user5805283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:14:04