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

指向结构体的指针数组退出循环后值异常变更的问题求助

问题原因分析

你遇到的核心问题是内存生命周期不匹配:

  • 如果在handleMenu函数里,你是在栈上创建的结构体实例(比如直接写struct Contact contact;,然后让phonebook[11] = &contact;),栈内存的生命周期仅限于函数执行期间。当handleMenu函数执行完毕返回后,栈上的这块内存会被操作系统回收、复用,后续主循环里再访问phonebook[11]指向的地址,读到的就是被覆盖的垃圾数据。
  • 哪怕你在函数里给结构体成员赋值成功,函数退出后栈内存失效,之前的赋值自然也就不成立了。
解决办法

要让结构体的地址能被保留并安全访问,必须使用堆内存分配,具体步骤:

  1. 用malloc或calloc为结构体分配堆内存,示例代码:
// 假设你的结构体类型是struct Contact
phonebook[11] = malloc(sizeof(struct Contact));
if (phonebook[11] == NULL) {
    // 处理内存分配失败的情况,比如打印错误提示
    perror("malloc failed");
    return;
}
  1. 之后再给结构体的first name赋值,比如:
strcpy(phonebook[11]->first_name, "张三");
// 或者用strncpy更安全,避免缓冲区溢出
strncpy(phonebook[11]->first_name, "张三", sizeof(phonebook[11]->first_name)-1);
phonebook[11]->first_name[sizeof(phonebook[11]->first_name)-1] = '\0';
  1. 注意:当你不再需要这个结构体时,要记得用free(phonebook[11]);释放堆内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:25:18