[英]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.