这是一个简单的链接列表C程序,它显示一些运行时错误! “空指针分配”
从未听说过,我在代码中没有看到任何错误?
我该怎么办?
#include <stdio.h>
#include<conio.h>
typedef struct node
{
int data;
struct node *next;
}node;
void main()
{
node *head,*P;
int n,i;
printf("Enter no. of elements\n");
scanf("%d",&n);
printf("Enter %d data elements\n",n);
head=(node*)malloc(sizeof(node));
scanf("%d",&(head->data));
head->next = NULL;
P=head;
for(i=1;i<n;i++)
{
P->next=(node*)malloc(sizeof(node));
P=P->next;
P->next=NULL;
scanf("%d",P->data);
}
while(P!=NULL)
{
printf("%d",P=P->data);
P=P->next;
}
}
答案 0 :(得分:3)
这里有很多错误:
malloc
时没有原型。 (要修复,#include <stdlib.h>
)。malloc
的返回值scanf("%d",P->data);
应为scanf("%d",&P->data);
printf("%d",P=P->data);
应为printf("%d",P->data);
你应该收到大部分警告。不要忽略编译器输出消息。
其中任何一个都可能导致您的错误(尽管我猜P=P->data
最有可能)。
此外,在尝试打印列表之前重置P = head;
,否则您将在结束时重新开始,因此您无法获得任何输出。
答案 1 :(得分:3)
http://www.faqs.org/qa/qa-3786.html
NULL指针分配
NULL指针赋值是运行时错误它由于各种原因而发生 原因之一是你的程序试图访问非法内存 地点。非法位置意味着位置在 操作系统地址空间或其他进程内存 空间。在stdio.h中,NULL被定义为0所以每当你的程序 尝试访问操作系统杀死程序的第0个位置 运行时分配错误,因为第0个位置在 操作系统地址空间和操作系统不允许 用户程序访问其地址空间
示例代码:
int* ptr = NULL;
*ptr = 8;
<强>解释强>
几乎在每个系统上,地址0都被保留。系统不允许您写入该位置。如果您尝试,您将获得运行时异常
您的代码中的一些更改!
#include<stdlib.h>
库。scanf("%d",P->data);
更改为scanf("%d",&P->data);
printf("%d",P=P->data);
至printf("%d",P->data);
P=head
重置头!这是Demo。
答案 2 :(得分:1)
程序中有三个错误:
scanf("%d",P->data);
- &gt; scanf("%d",&P->data);
printf("data %d \n", P=P->data);
- &gt; printf("data %d \n", P->data);
当您运行while
循环时,指针P
指向最后一个节点,因此发生崩溃。在P=head
循环之前while
。