div*_*gon 0 c pointers segmentation-fault
我有以下C程序.当我包含以下行时,它会起作用,否则会出现分段错误:
printf("head(%p), last(%p), newnode(%p)\n", head, last, newnode);
Run Code Online (Sandbox Code Playgroud)
知道这里有什么问题吗?
这是我的整个计划.这是一个基本的循环队列示例.
#include "stdio.h"
#include "malloc.h"
struct node {
int data;
struct node *next;
};
typedef struct node NODE;
void display(NODE *);
int main(void) {
NODE *head, *last, *newnode = NULL;
int i = 5;
for ( ; i > 0; i--) {
newnode = (NODE *) malloc(sizeof(NODE));
newnode->data = i*10;
newnode->next = NULL;
//printf("head(%p), last(%p), newnode(%p)\n", head, last, newnode);
if (head == NULL) {
head = newnode;
last = newnode;
} else {
last->next = newnode;
last = newnode;
}
last->next = head;
}
display(head);
return 1;
}
void display(NODE *head) {
NODE *temp = NULL;
temp = head;
printf("Elements --> ");
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
您需要明确初始化head和last对NULL也.
在你的声明中:
NODE *head, *last, *newnode = NULL;
Run Code Online (Sandbox Code Playgroud)
只是 newnode被初始化为NULL.因此,稍后在if/else中,您正在测试/分配随机内存.
做这样的事情:
NODE *head, *last, *newnode;
head = last = newnode = NULL;
Run Code Online (Sandbox Code Playgroud)
你不能假设指针被自动初始化为NULL,即使某些系统可能就是这种情况.声明的变量static是一个例外.始终将C中的变量初始化为合理的值,尤其是指针.
当您访问垃圾内存时,您正在调用未定义的行为.执行此操作时,您可能会发现不一致和混乱的结果.在你的情况下,添加printf 似乎解决了问题.这会影响代码行为的原因是依赖于实现,并且 - 一旦引入了未定义的行为 - 超出了您的控制范围.