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

C程序动态内存分配错误与字符串值问题求助

问题分析与修复

核心问题

你的程序所有联系人姓名被统一更新的原因出在create函数的指针赋值逻辑上:

(p+i)->name = (char *)calloc(10, sizeof(char));
(p+i)->name = name; // 此处直接覆盖了刚分配的内存指针

这段代码里,你先给(p+i)->name分配了内存,但立刻将其指向main函数中共享的name数组。每次输入新名字时,该数组的内容会被覆盖,导致所有联系人的name成员都指向同一个被更新的缓冲区,最终显示的全是最后输入的名字。

修复方案

将指针赋值改为字符串拷贝操作,把输入的名字内容复制到刚分配的独立内存中。同时建议根据名字实际长度动态分配内存,避免固定长度导致的缓冲区溢出:

修改后的create函数:

phonecontact *create(phonecontact *p, int phone, char name[], int i) {
    // 根据名字长度动态分配内存,+1用于存储字符串结束符'\0'
    (p+i)->name = (char *)malloc(strlen(name) + 1);
    if ((p+i)->name == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 把输入的名字内容拷贝到独立内存中
    strcpy((p+i)->name, name);
    (p+i)->phone = phone;
    printf("\n%s\n", (p+i)->name);
    return p;
}

额外优化建议

  1. 原代码中calloc(10, sizeof(char))仅分配10字节空间,若输入名字超过9个字符会触发缓冲区溢出,动态分配内存更安全。
  2. 程序结束前记得释放所有分配的内存,避免内存泄漏:
// 在main函数末尾添加内存释放逻辑
for (int i = 0; i < num; i++) {
    free(p[i].name);
}
free(p);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:15:54