问题:是什么导致这些值随机变化?
信息:
我的代码:
int q = nonZero;
for(j = nonZero;j>1;j--)
{
printf("Top: %i %i\n",j,q);
qsort(tree,j,sizeof(Node),cmp);
printf("Bottom: %i %i\n",j,q);
Node t = {tree[0],tree[1],-1};
tree[0] = &t;
tree[1] = tree[j];
tree[j] = NULL;
}
不是一个复杂的小程序。从树的顶部两个节点中选择一个节点,使新的顶部节点重新排列数组,然后重复。我添加了“q”作为调试值,但对于到底发生了什么我一无所知。如果我尝试运行它,则j通常应从73开始,应该是73,71,70,69,68 ... 3,2,并且q将无限期地保持为73。这是我的输出:
Top: 73 73
Bottom: -796584576 32767
Segmentation fault
但这还不是全部,没有重新编译,我得到了:
Top: 73 73
Bottom: 0 0
Segmentation fault
它始终会给我这两个输出之一。经过几次运行,我看到q值从未改变为32767,但j值(这里为-796584576)始终是一些不同的,非常大的负数。有谁知道为什么在地球上qsort似乎在改变我的j值,以及q似乎完全不相关的值?
最佳答案
qsort()
调用建议tree[]
是Node
的数组,但是语句tree[0] = &t;
则建议它是一个指针数组。当时的情况是:
qsort( tree, j, sizeof(&Node), cmp ) ;
或更好
qsort( tree, j, sizeof(*tree), cmp ) ;
后者确保大小是树的数组大小,而不管其类型如何,因此更安全,更易于维护。
将
t
的地址分配给作用域比t
更大的变量也是注定的。