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

指针解引用为什么返回垃圾值?C语言双向链表开发问题求助

问题核心原因

你遇到的问题本质是栈内存生命周期非法引用,具体触发逻辑如下:

  • 你在getitem函数内定义的temp_data是函数局部变量,存储在当前函数的栈帧中,当getitem执行结束返回后,对应的栈帧会被系统回收,这块内存的内容会被后续其他函数调用的栈数据覆盖。你存在节点data成员里的是temp_data的栈地址,函数返回后这个地址指向的内存已经失效,解引用自然得到垃圾值。
  • 你提到已经为data成员分配了堆内存,但你后续直接把data指针赋值为栈变量的地址,还会导致之前分配的堆内存泄漏,没有任何指针可以再找到那块内存进行释放。
修复方案

你可以选择以下两种方案中的任意一种解决:

  • 方案一:保留int* data的结构体定义,把输入值拷贝到堆内存中,不要直接赋值栈地址,示例代码逻辑:
// 原有错误写法
int temp_data;
scanf("%d", &temp_data);
node->data = &temp_data; // 错误,赋值的是栈地址

// 修正后写法
int temp_data;
scanf("%d", &temp_data);
// 给data分配堆内存,注意分配后不要修改data指针本身的值,只修改指针指向的内容
node->data = (int*)malloc(sizeof(int));
if (node->data == NULL) {
    // 自行补充内存分配失败的异常处理逻辑
}
*(node->data) = temp_data; // 把输入值拷贝到堆内存中

注意后续销毁链表时,要先释放每个节点data指向的堆内存,再释放节点本身,避免内存泄漏。

  • 方案二:如果没有特殊要求,直接把结构体定义里的int* data修改为int data,直接存储整数值,不需要额外分配堆内存,也不会出现指针引用失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:54:05