簡體   English   中英

變量神秘地變化

[英]variables vary mysteriously

問題:是什么導致這些值隨機變化?


信息:

我的代碼:

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

它始終會給我這兩個輸出之一。 經過幾次運行后,我看到q值從未更改為32767,但j值(此處為-796584576)始終是一些不同的,非常大的負數。 任何人都不知道為什么在地球上qsort似乎正在改變我的j值,以及q似乎完全無關的值?

我不確定這是否是您的問題,但是由於t是局部變量,因此它將在該循環結束時超出范圍,因此將其分配給tree[0]會使tree[0]不確定。

qsort()調用建議tree[]Node的數組,但是語句tree[0] = &t; 而是建議它是一個指針數組。 當時的情況是:

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

或更好

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

后者確保大小是樹的數組大小,而不管其類型如何,因此更安全,更易於維護。

t的地址分配給作用域大於t的變量也注定了。

t是一個局部變量,其生命周期在每次迭代結束時結束。 因此,超出該迭代范圍的地址是未定義的行為。 您必須使用malloc分配樹節點的副本。

qsort正在破壞內存。 如果這是您編寫的qsort,則可能出現錯誤,將其寫入無效的位置。 如果這是庫qsort,則可能是遞歸函數,該函數溢出堆棧,從而破壞了本地var。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM