变量神秘地变化

时间:2011-12-01 22:02:58

标签: c variables memory

问题:导致这些值随机变化的原因是什么?


的信息:

我的代码:

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开始,它应该是,预期的是它将是72,71,70,69,68 ...... 3,2并且q将无限期地保持为73。这是我的输出:

Top: 73 73
Bottom: -796584576 32767
Segmentation fault

但不是全部,没有重新编译,我得到了:

Top: 73 73
Bottom: 0 0
Segmentation fault

它始终会给我这两个输出中的一个。经过几次运行后,我看到32767从未改变,q值,但是j值,这里是-796584576,总是有些不同的荒谬大负数。任何人都知道为什么在地球上看起来好像qsort正在改变我的j值,以及似乎是一个完全不相关的q值?

4 个答案:

答案 0 :(得分:4)

我不确定这是不是你的问题,但由于t是一个局部变量,它会在该循环结束时超出范围,因此将其分配给tree[0]会使{ {1}}未定义。

答案 1 :(得分:2)

qsort()调用表明tree[]是一个Node的数组,但语句tree[0] = &t;反而暗示它是一个指针数组。那就是当时的情况:

qsort( tree, j, sizeof(&Node), cmp ) ;

或更好

qsort( tree, j, sizeof(*tree), cmp ) ;

后者确保大小是任何树是一个数组的大小,无论其类型如何,因此更安全,更易于维护。

t的地址分配给范围大于t的变量也是注定要失败的。

答案 2 :(得分:1)

t是一个局部变量,其生命周期以每次迭代结束而结束。因此,保持超出该迭代的地址是未定义的行为。您必须使用malloc分配树节点的副本。

答案 3 :(得分:0)

qsort破坏了内存。如果这是您编写的qsort,则可能会出现写入无效位置的错误。如果这是一个库qsort,它可能是一个溢出堆栈的递归函数,破坏了你的本地变量。

相关问题