2015-06-20 123 views
0

我想讀一個數字作爲int數組,但會發生一些奇怪的事情。Realloc循環失敗

#include <stdlib.h> 
#include <stdio.h> 

int getNumber(int ** dst) 
{ 
    int size = 0; 
    int num = 0; 

    scanf("%c", &num); 
    while(num != 10) 
    { 
     if((num < 48) || (num > 57)) 
     { 
      printf("This is not a number.\r\n"); 
      return -1; 
     } 
     size++; 

     *dst = (int *) realloc(*dst, sizeof(int) * size); 
     *dst[ size - 1 ] = (num - 48); 

     scanf("%c", &num); 
    } 

    return size; 
} 

int main() 
{ 
    int * number = NULL; 
    int size = 0; 

    size = getNumber(&number); 

    return 0; 
} 

第一迭代通常通過,但在第二次迭代*dst[ size - 1 ] = (num - 48);失敗。 有什麼不對?

+0

「失敗」意味着什麼?崩潰,產生錯誤的輸出,在屏幕上畫一隻鴨子? –

+0

@MatsPetersson它引發「訪問衝突」。我修復了它。 – KKastaneda

+0

是的,我的觀點是你應該描述實際發生的情況,而不僅僅是「不起作用」。 –

回答

2

哦,我找到了!
問題在於處理解引用操作符的功能。
方括號的優先級高於星號。
因爲,如果我修改該行:
*dst[ size - 1 ] = (num - 48);
就像是:
(*dst)[ size - 1 ] = (num - 48);
它將正常工作!

+0

你可以通過引用'int&* dst'而不是'int ** dst'來傳遞指針來避免這個問題[當然,你需要在所有相關位置刪除一些'*'和'&] –

+0

@MatsPetersson我知道它,但我使用C,而不是C++。 – KKastaneda

1

因爲[]比*運算符的優先級高,所以它的行爲如同*(dst[size-1])
而不是(*dst)[size-1]