看看这段代码:
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位数的垃圾编号。谁能告诉我为什么?感谢
答案 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)
你必须在使用之前使用它来指向你的指针:)!