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

C语言实现链表读取打印单值 执行scanf后无输出问题排查

故障原因

程序在scanf执行后无任何输出,是两个问题共同导致的:

  • 触发空指针解引用的致命运行时错误:display()函数中while循环的终止条件是present != NULL,也就是说循环退出时present已经是NULL值。你在循环外额外编写的printf("%d",present->val);会直接访问空指针指向的内存,触发段错误,程序执行到这行时会直接异常终止,无法正常走完流程。
  • 输出缓冲区未刷新:C语言的标准输出默认采用行缓冲机制,你在循环内写的打印语句printf("%d",present->val);既没有添加换行符\n,也没有手动调用fflush(stdout)触发缓冲区刷新,程序崩溃时缓冲区里暂存的待打印内容不会被推送到终端,最终表现为scanf执行后完全没有输出。
修复方案
  • 删除display()函数中while循环外部多余的、访问空指针的打印语句
  • 打印内容时添加换行符,或者主动调用fflush(stdout)刷新输出缓冲区,避免内容滞留在内存缓冲区中
  • 不建议使用new作为变量名:new是C的关键字,虽然纯C环境下编译不会报错,但后续如果混用C编译会直接报错,替换为new_node这类语义清晰的命名更稳妥。

修复后的可运行代码如下:

#include<stdlib.h>
#include<stdio.h>
void display();

struct ll{
    int val;
    struct ll* address;
};
struct ll *new_node=NULL,*start=NULL,*present=NULL;


int main(void)
{
    int num;
    scanf("%d",&num);
    // 读取链表节点
    new_node=(struct ll*) malloc(sizeof(struct ll));
    new_node->val=num;
    new_node->address=NULL;
    
    if(start==NULL)
    {
        start=new_node;
        present=new_node;
    }
    else
    {
        present->address=new_node;
        present=new_node;
    }
    // 调用打印函数输出链表内容
    display();
}

void display()
{
    present=start;
    // 遍历打印链表
    while (present!=NULL)
    {
        printf("%d\n",present->val);
        present=present->address;
    }
}

内容的提问来源于stack exchange,提问作者Bhavesh Naidu Kulluru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:48:28