C语言遍历链表打印节点地址时输出地址全相同问题求助
问题描述
作业任务为输出链表中每个节点的地址,代码运行后打印出的所有地址都相同,不符合预期,对应C语言实现代码如下:
#include <stdio.h> #include <stdlib.h> struct element { float x; struct element * next; }; void show(struct element *lista) { struct element *temp=lista; while(temp != NULL) { printf("%f\n",temp->x); printf("%p\n",&temp->x); temp = temp->next; } } int main() { struct element *lista=NULL; struct element *wsk=malloc(sizeof(struct element)); wsk->x=5.5; wsk->next=NULL; lista=wsk; struct element *wsk2=malloc(sizeof(struct element)); wsk2->x=1.3; wsk2->next=lista; lista=wsk2; struct element *wsk3=malloc(sizeof(struct element)); wsk3->x=8.1; wsk3->next=lista; lista=wsk3; show(lista); return 0; }
问题原因
所有地址打印重复的核心问题出在地址打印的语句上:
- 如果你运行时所有输出地址完全一致,基本可以确定你实际写的打印语句是
printf("%p\n",&temp);,只是贴代码的时候没注意写错成了&temp->x。&temp取的是临时指针变量temp自己的内存地址,这个变量是show函数里定义的局部变量,整个函数运行时它在栈上的位置是固定的,不管你让temp指向哪个节点,temp自身的存储位置从来不变,打出来当然全是同一个地址。 - 就算你确实写的是
&temp->x,这行打印的也只是每个节点里x成员的地址,不是整个节点的起始地址,不符合输出节点地址的作业要求。
修正方法
要打印节点本身的地址,直接把temp传给%p就行——temp本身就是存储当前节点地址的指针,它存的值就是你要的节点起始地址。改完的show函数如下:
void show(struct element *lista) { struct element *temp=lista; while(temp != NULL) { printf("节点存储的x值:%f\n", temp->x); printf("当前节点内存地址:%p\n", (void*)temp); temp = temp->next; } }
补个小提醒:代码运行结束前记得把三个malloc出来的节点逐个free掉,避免内存泄漏,不过作业场景下不写这步也不会影响地址打印的结果。
内容的提问来源于stack exchange,提问作者mkownak
相关产品推荐
相关产品推荐

