2014-11-02 95 views
-1

这是一个简单的C程序linklist,它显示一些运行时错误! “空指针分配”空指针赋值错误

从来没有听说过它,我没有看到代码中的任何错误?

我该怎么办?

#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; 
} 

} 
+4

请缩进你的代码,让我们读它。 – alk 2014-11-02 11:39:44

+0

Yaa现在工作!其实我第一次遇到它..所以有点困惑!非常感谢! – user3672971 2014-11-02 11:44:06

回答

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;之前,试图打印出你的清单,否则你开始在最后,所以你不会得到任何输出。

+0

Thnks!最后一个真的有帮助!只得到一个单一的元素! – user3672971 2014-11-02 11:51:19

1

有程序三个错误:

scanf("%d",P->data); - >scanf("%d",&P->data);

printf("data %d \n", P=P->data); - >printf("data %d \n", P->data);

而且当你正在运行while循环指针P因此指向最后一个节点崩溃正在发生。在while循环之前做P=head

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>库的malloc。
  • 变化scanf("%d",P->data);scanf("%d",&P->data);
  • 并在打印前printf("%d",P=P->data);printf("%d",P->data);
  • P=head复位头!

这里是Demo