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; }
额外优化建议
- 原代码中
calloc(10, sizeof(char))仅分配10字节空间,若输入名字超过9个字符会触发缓冲区溢出,动态分配内存更安全。 - 程序结束前记得释放所有分配的内存,避免内存泄漏:
// 在main函数末尾添加内存释放逻辑 for (int i = 0; i < num; i++) { free(p[i].name); } free(p);
内容的提问来源于stack exchange,提问作者Viraj Desai
相关产品推荐
相关产品推荐

