2012-11-23 35 views
0

我已經爲嵌入式系統編寫了一段相當大的代碼,其中一個函數用於計算循環中的calloc結構併爲其賦值。我遇到了代碼中的一個錯誤,它花了我一些時間來分離和修復。如果有需要,我希望看到別人能否在分享我的經驗之前指出錯誤。循環中的存儲器初始化:空閒時出現分段錯誤

聲明塊:

int *arr; 
int i, num; 
printf("Enter number of elements: "); 
scanf("%d", &num); //Assume num>=0 
arr = calloc(num, sizeof(int)); 
if (arr == NULL) 
    return; 
i = num; 

這下面的代碼塊/塊將拋出調用free()例外,爲什麼?

for (i; i > 0; i--) { 
    arr[num - i] = i; 
} 
free(arr); 

OR

while (i--) { 
    arr[num - i] = i; 
} 
free(arr); 
+1

而第二個會以類似的方式崩潰:當'i == 1'在循環的頂部時,'while'條件將成功並且也將'i'變爲0;那麼循環體將再次嘗試寫入'arr [num - 0]'。 –

+1

你的循環看起來很好。你能發佈一個崩潰的完整例子嗎? (ideone,鍵盤,無論你喜歡,還是隻是在這裏) –

+0

@j_random_hacker:這也是我最初的想法,但循環沒關係。 – acjay

回答

2

for是正確的,但在while

問題試試這個簡單的一個:

for(i=0;i<num;i++) 
     arr[i]=i; 
    free(arr); 

    i=0; 
    while(i<num) 
     { 
     arr[i]=i; 
     i++; 
     } 
    free(arr); 
4

你的第二個環

while (i--) 
{ 
    arr[num - i] = i; 
    printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]); 
} 

原因是因爲我

你開始與i == 10所以第一個任務是arr[10 - 9] = 9的後減量的問題; 當i達到1這是最後一個循環你arr[10 - 0] = 0

使分配到數組範圍之外寫0..9

,如果你寫while循環這樣它應該工作

do 
{ 
    arr[num - i] = i; 
    printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]); 
} 
while (--i); 
+0

@AndersK你是正確的,問題是在while循環中,因爲我的postdecrement的行爲。在for循環中,我在循環語句評估之後遞減,而在while循環中,遞減循環語句。 –

0

另一個問題是,當用戶輸入負值num,那麼您的while循環可能會無限,因爲-1或任何其他負值的計算結果爲True。如果i超出您分配的內存邊界(較低或較高),它也可能導致分段錯誤。

+0

我的不好,我應該指定num> = 0,我在代碼中進行了限制檢查,但爲了簡潔起見,沒有在這裏添加它們。 –

相關問題