2011-09-06 21 views
0

我有這樣一段代碼:如何操作使用malloc聲明的int數組?

// Returns the fibonacci range until the specified limit 
int fibo(int** output, int limit) 
{ 
    // Must be 1 or more 
    if(limit < 1) return 0; 

    int* range = (int*)malloc(sizeof(int) * limit); 
    assert(range); 

    int i; 

    // Calculate the range 
    for(i = 0; i < limit; i++) 
    { 
     int value; 

     if(i == 0) value = 0; 
     if(i == 1) value = 1; 
     else  value = range[i - 2] + range[i - 1]; 

     range[i] = value; 
    } 

    *output = range; 

    return 1; 
} 

與極限運行它15個輸出

65 1,66,67,133,200,333,533,866,1399,2265, 3664,5929,9593,15522

這是不正確的。我懷疑這是因爲我寫的東西,如range[i - 2],當我不應該這樣做。我試圖使用int的大小作爲每個值之間的跳躍,並得到分割錯誤。我正確使用[]嗎?任何人都可以想到爲什麼我的輸出是奇怪的任何其他原因?

Here's all the code for the program

+0

'range [i-2]'只要'i> 2'就可以。你有沒有嘗試在調試器中逐句通過你的代碼? –

+4

這只是一個簡單的錯誤。仔細考慮一下你的代碼爲'i == 0'做了什麼......(提示:你想要「其他如果」爲第二個手臂) – Nemo

+0

切向注意:'malloc'的規範成語是'int * range = malloc(sizeof (*範圍)*限制)'。不要強制轉換,也不要在'sizeof'中引用硬編碼類型。 –

回答

1

變化

if(i == 1) value = 1; 

else if(i == 1) value = 1; 

編輯: 就意識到了這一點已經在評論回答。

+0

Nemo從來沒有寫過這個答案 – Hubro

0

的問題是與你的IFS你有兩個if語句

if(i == 0) value = 0; 

if(i == 1) value = 1; 
    else  value = range[i - 2] + range[i - 1]; 

如果我是0,那麼第二個,如果計算結果爲範圍[-2] +範圍[-1 ]所以未定義的內存數據

您需要使用else,以便它只是一個if語句(也作爲樣式總是使用{}使事情更清晰)

if(i == 0) { 
    value = 0; 
} else if(i == 1) { 
    value = 1; 
} else { 
    value = range[i - 2] + range[i - 1]; 
} 

在這個例子中,在循環之前設置range [0]和[1]可能更好,並且在2開始循環,因此不需要if。

+1

+ 1提到開始循環在2,-1的風格推薦,其清晰度顯然是主觀的。 –

+0

我甚至在開始寫作之前就考慮過在2開始循環,但是我怎麼能夠用'limit = 1'來運行函數呢? – Hubro

0

你缺少if (i==0)if (i == 1)之間的else,所以第一次通過兩個0的情況和2+情況下得到運行。