C语言链表传参问题:函数内节点值正确返回main后变0如何解决
问题根因
你的代码核心问题是链表节点存储的是栈变量的指针,而非实际数值,执行流程触发了指针指向内容被意外修改的问题:
- 调用
insertStart(&list, &displayNum)时,你把main函数中栈变量displayNum的地址传给了插入函数 insertStart内直接将这个地址赋值给了newNode->data,此时节点的data指针和displayNum指向同一块栈内存- 函数内打印时还未修改
displayNum的值,所以输出正常 - 回到
main后你执行了displayNum = 0;,直接修改了data指针指向的内存内容,后续解引用打印自然就得到0
修复方案
你可以根据链表的设计需求选择任意一种方案:
方案1:修改链表节点存储实际数值(更推荐,实现简单无额外内存管理负担)
修改LinkedListNode结构体定义,将data字段从int*类型改为int类型:
// 修改前结构体示例 typedef struct LinkedListNode { int* data; struct LinkedListNode* next; } LinkedListNode; // 修改后 typedef struct LinkedListNode { int data; struct LinkedListNode* next; } LinkedListNode;
同步修改插入函数逻辑:
// 参数改为直接传int值,也可以保留传指针后解引用赋值 void insertStart(LinkedList * list, int calcData) { LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode)); newNode->data = calcData; // 直接存值,和原变量无关联 newNode->next = list->head; list->head = newNode; printf("Node value inside function: %d\n", list->head->data); }
main函数调用时改为直接传值:
insertStart(&list, displayNum);
方案2:保留指针存储,为数值单独申请堆内存
如果你的链表设计需要兼容多类型数据必须存指针,就需要给data指向的内容单独申请堆内存,避免和栈变量绑定:
void insertStart(LinkedList * list, int* calcData) { LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode)); // 给data单独申请堆内存 newNode->data = (int*)malloc(sizeof(int)); // 把数值拷贝到堆内存中,和原栈变量脱离关联 *(newNode->data) = *calcData; newNode->next = list->head; list->head = newNode; printf("Node value inside function: %d\n", *(list->head->data)); }
注意:使用该方案时,删除节点需要先释放
data指向的堆内存,再释放节点本身,否则会出现内存泄漏。
内容的提问来源于stack exchange,提问作者hullo
相关产品推荐
相关产品推荐

