gpt4 book ai didi

c - C 中结构指针出现段错误

转载 作者:行者123 更新时间:2023-11-30 14:55:39 26 4
gpt4 key购买 nike

这是代码,出现段错误。我创建了两种结构数据类型并通过 malloc() 函数为它们分配内存,但它仍然显示段错误。

 #include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node * next;
};

struct Queue{
struct Node *front, *rear;
};

struct Node* newNode(int n){
struct Node* node=(struct Node*)malloc(sizeof(struct Node));
node->next=NULL;
node->data=n;
return node;
}

void printNode(struct Queue* queue){
while(queue->front<=queue->rear){
printf("%d ",queue->front->data);
queue->front=queue->front->next;
}
}
int main(void) {
int i;
struct Queue* queue=(struct Queue*)malloc(sizeof(struct Queue));
queue->front=NULL;
queue->rear=NULL;

for(i=0;i<4;i++){
if(queue->rear==NULL){
queue->front->next=queue->rear->next=newNode(i);
}
else{
queue->rear->next=newNode(i);
queue->rear=queue->rear->next;
}
}
printNode(queue);
return 0;
}

最佳答案

评论中已经提到的主要问题如下:

首先,初始化queue->frontNULL ,但然后在写入 queue->front->next = ... 时访问它。这是代码中产生未定义行为的第一点(可能导致段错误)。所以你应该写类似 queue->front = queue->rear = newNode(i) .

二、循环条件中while(queue->front<=queue->rear) ,您比较内存地址,这至少是没有意义的,因为不能保证“较早”的指针具有比“较晚”的指针更低的内存地址。实际上,我认为比较不是从同一个对象中取出的内存地址也是未定义的行为。一般来说,我不会循环直到到达 queue->rear但直到到达具有 next == NULL 的节点.

第三,你的printNode -函数改变 queue ,产生内存泄漏,并且连续两次调用 printNode会产生不同的结果。一般情况下,该函数应该调用 printQueue ,并且它应该在本地运行 Node -对象:

void printQueue(const struct Queue* queue){
struct Node *node = queue->front;
while(node){
printf("%d ",node->data);
node=node->next;
}
}

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

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