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
相关产品推荐
相关产品推荐

