语言C:为什么我的作业语句破坏了我的数据



看看这个代码:

void insert(Poly **A, int degree, int coef2) {
    heapSize = heapSize+1;
    Poly *key;
    if (heapSize == 1) {        // heap was originally empty
        key->coef = coef2;
        key->degree = degree;
        A[heapSize-1] = key;
        return;
    }
    // create an "minus infinity" degree poly 
    int keyDegree = degree;
    key->coef = coef2;
    key->degree = MIN_INT;
    A[heapSize-1] = key ;
    heapIncreaseKey(A, heapSize-1, keyDegree);
}

Poly是一个结构,其成员都是int类型。"a"是Poly指针的数组。每当执行语句"A[heapSize-1]=key"(在if块中)时,"key"的成员都会由于某种原因更改为"垃圾"值。例如,就在执行该语句之前,"key"的成员的值为5和6。执行此语句后,值将变为一些8位数的垃圾数字。有人能告诉我为什么吗?感谢

您缺少

key = malloc(sizeof(Poly));

声明key会给您一个指针,但它不会指向有效的位置。取消引用key会导致未定义的行为。

编辑

此外,看起来heapsize是一个全局常量,而A是指向堆的指针。有一个全局变量记录一个非全局变量的大小似乎很奇怪。

我将使heapsize成为与A具有相同作用域的变量,并将指向它的指针作为处理A的函数的参数。

key是一个未初始化的指针,然后您取消引用它,并将值分配到它所指向的不存在的位置。这可能会被valgrind捕获。

为密钥分配内存,并更改签名以传入a数组的大小。验证堆大小是否仍在A的分配范围内。更好的是,如果您重构以在Poly的数组中保留结构而不是指针,则不需要键变量。然后你可以直接将你的两个输入分配给A,比如A[heapSize].coeffe=coeff2;此外,您可以通过在函数中使用heapSize来简化一些事情,而无需在第一行中递增,只在退出时递增。这样,您就不需要在任何地方都使用heapSize-1。

键是一个未初始化的指针,您正在向它写入。

这种方式存在着强烈的未定义行为。

键不指向任何内容。此外,未提供"A"的分配长度。建议你在"malloc"等方面努力:)

在使用指针之前,必须对其进行malloc:)!

最新更新