链接列表:引发异常:读取访问冲突。 B为0xCDCDCDCD

时间:2019-02-28 15:25:03

标签: c pointers exception linked-list nodes

我已经在下面的链接列表代码中发布了我的第一次尝试。目的是获得一个由10个整数组成的链表,并遍历该列表以使奇数加倍,偶数减半。由于我是链表的新手,因此我目前仅在第一部分中工作:生成列表。

从我看到的例子中,我觉得还不错。它编译正常,但是当我运行它时,出现以下错误消息: “抛出异常:读取访问冲突。B为0xCDCDCDCD。” 这是说“ C = B-> next”的行。

有人知道这意味着什么和/或为什么发生吗? 任何输入将不胜感激:)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

struct node
{
    int data;
    struct node* next;
};

void freeList(struct node* head);

int main(void)
{
    srand(time(NULL));


    struct node * A = NULL;
    A = malloc(sizeof(struct node));
    struct node* B = malloc(sizeof(struct node));
    struct node* C = malloc(sizeof(struct node));
    struct node* D = malloc(sizeof(struct node));
    struct node* E = malloc(sizeof(struct node));
    struct node* F = malloc(sizeof(struct node));
    struct node* G = malloc(sizeof(struct node));
    struct node* H = malloc(sizeof(struct node));
    struct node* I = malloc(sizeof(struct node));
    struct node* J = malloc(sizeof(struct node));

    A->data = (rand() % 10) + 1;
    B->data = (rand() % 10) + 1;
    C->data = (rand() % 10) + 1;
    D->data = (rand() % 10) + 1;
    E->data = (rand() % 10) + 1;
    F->data = (rand() % 10) + 1;
    G->data = (rand() % 10) + 1;
    H->data = (rand() % 10) + 1;
    I->data = (rand() % 10) + 1;
    J->data = (rand() % 10) + 1;

    B = A->next;
    C = B->next;
    D = C->next;
    E = D->next;
    F = E->next;
    G = F->next;
    H = G->next;
    I = H->next;
    J = I->next;
    J->next = NULL;

    struct node* current = A;
    while (current != NULL)
    {
        printf("%d-->", current->data);
        current = current->next;
    }

    freeList(A);

    return 0; 
}

void freeList(struct node* A)
{ 
    struct node* temp;

    while (A != NULL)
    {
        temp = A;
        A = A->next;
        free(temp);
    }

}

2 个答案:

答案 0 :(得分:4)

这是你的问题

B = A->next;

您从未为A->next分配任何值,因此该值未初始化。运行时环境在分配时用A填充了0xCDCDCDCD所指向的内存,以帮助您发现它尚未初始化。上面的代码行读取A->next的未初始化值,并将其存储在B中。这不是有效的指针地址!当您尝试取消引用无效指针C = B->next;时,下一行代码B引发异常。

也许您打算写A->next = B;吗?

答案 1 :(得分:3)

您应该将节点分配给下一个指针,而不是相反。节点就是这样链接的。

A->next = B;
B->next = C;
. 
.
.