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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:03:15