看看这个代码:
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:)!