语言C:为什么我的任务声明毁了我的数据?

时间:2011-06-25 16:23:59

标签: 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位数的垃圾编号。谁能告诉我为什么?感谢

6 个答案:

答案 0 :(得分:4)

你错过了

key = malloc(sizeof(Poly));

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

修改

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

我会使heapsize变量与A具有相同的范围,并将指针作为参数传递给处理A的函数。

答案 1 :(得分:2)

key是一个未初始化的指针,然后您取消引用它并将值分配给它指向的不存在的位置。这可能是由valgrind抓住的。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

这种方式存在严重的未定义行为。

答案 4 :(得分:0)

键不指向任何东西。此外,未提供“A”的分配长度。 建议您加入'malloc'等等。)

答案 5 :(得分:0)

你必须在使用之前使用它来指向你的指针:)!