gpt4 book ai didi

c - C中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:47 24 4
gpt4 key购买 nike

我有以下 C 程序。当我包含以下行时它会起作用,否则会出现段错误:

printf("head(%p), last(%p), newnode(%p)\n", head, last, newnode);

知道这里有什么问题吗?

这是我的整个程序。这是一个基本的循环队列示例。

#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");

}

最佳答案

您还需要将 headlast 显式初始化为 NULL

在您的声明中:

NODE *head, *last, *newnode = NULL;

只有 newnode 被初始化为NULL。因此,稍后在您的 if/else 中,您正在测试/分配给随机内存。

做这样的事情:

NODE *head, *last, *newnode;
head = last = newnode = NULL;

不能假设指针自动初始化为NULL,即使在某些系统上可能是这种情况。声明为 static 的变量是一个异常(exception)。始终将 C 中的变量初始化为合理的值,尤其是指针。

当您访问垃圾内存时,您正在调用 undefined behavior .当您这样做时,您可能会观察到不一致和令人困惑的结果。在您的情况下,添加 printf 似乎 可以解决问题。这会影响您的代码行为的原因取决于实现,并且 - 一旦您引入了未定义的行为 - 就超出了您的控制范围。

关于c - C中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com