空指针赋值错误

时间:2014-11-02 11:35:24

标签: c

这是一个简单的链接列表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;
}

}

3 个答案:

答案 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都被保留。系统不允许您写入该位置。如果您尝试,您将获得运行时异常

您的代码中的一些更改!

  • 包含malloc的#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