在C中获取结构指针的分段错误

时间:2017-08-11 17:14:42

标签: c

以下是代码,获取分段错误。 我创建了两个struct数据类型,并通过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;
    }

2 个答案:

答案 0 :(得分:1)

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

首先,您使用queue->front初始化NULL,然后在撰写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;
    }
}

答案 1 :(得分:0)

您的队列中首先出现的问题是

插入

最后修改插入说明插入(有中间插入方式,查看其他帖子)

如果没有节点,前后都相同,则后端现在指向新节点,现在新节点成为rear

for(i=0;i<4;i++){
    Node* temp = newNode(i);

    if(queue->front==NULL){
        queue->front = temp;
        queue->rear = temp;

    }
    else{
        queue->rear->next=temp;
        queue->rear=temp;
    }
}

然后 q ueue-&gt; front&lt; = queue-&gt; rear建议的打印无效。 - BLUEPIXY 参见评论部分

void printNode(struct Queue* queue){

    if(queue->front==NULL)
    {
        printf("\nQueue is empty\n");
        return;
    }
    Node *ptr;
    ptr=queue->front;
    printf("\n\nThe queue :\n\n");
    while(ptr)
    {
        printf("%d->",ptr->data);
        ptr=ptr->next;
    }
    printf("NULL\n");
    return;

}

执行

#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){

    if(queue->front==NULL)
    {
        printf("\nQueue is empty\n");
        return;
    }
    Node *ptr;
    ptr=queue->front;
    printf("\n\nThe queue :\n\n");
    while(ptr)
    {
        printf("%d->",ptr->data);
        ptr=ptr->next;
    }
    printf("NULL\n");
    return;

}
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++){
        Node* temp = newNode(i);

        if(queue->front==NULL){
            queue->front = temp;
            queue->rear = temp;

        }
        else{
            queue->rear->next=temp;
            queue->rear=temp;
        }
    }
    printNode(queue);
    return 0;
}

输出

The queue :

0->1->2->3->NULL
Program ended with exit code: 0