2016-10-22 75 views
1

我試圖創建任意大小的數組,出於某種原因,這個代碼在這裏工作:困惑指針和傳遞它們的參數

int rand_tab(unsigned int n, int min, int max, int** dest){ 
    if(!(*dest = malloc(sizeof(int)*n))) return 0; 
    return 1; 
} 

與隨機數生成主:

int* tab; 
if(!(rand_tab(taille, min, max, &tab))) return -1; 
for(i=0; i<taille; i++) tab[i] = random(min, max); 

但這種崩潰(儘管它編譯就好了):

int rand_tab(unsigned int n, int min, int max, int** dest){ 
    if(!(*dest = malloc(sizeof(int)*n))) return 0; 
    for(i=0; i<n; i++) *dest[i] = random(min, max); 
    return 1; 
} 

,因爲我通過&tab的功能,dest現在指向tab,這意味着*dest[i]應該相當於主要編寫tab[i]

如果我將*dest[i]替換爲*(*dest+i)它可以工作。這裏發生了什麼?

+2

優先級:'*'的優先級低於'[]'。在函數中使用'(* dest)[i]'。 –

+2

這必須是重複的,可能是很多次。與往常一樣,困難在於找到重複。找到重複問題比回答問題要困難得多。 –

+0

確實,謝謝你的幫助,我現在感覺很蠢。至於找到重複,如果我能找到它,我不需要問這個問題。乾杯! – Kwantuum

回答

3

的問題是,下面的表達式

*dest[i] = random(min, max) 

需要括號圍繞*dest

(*dest)[i] = random(min, max) 

由於方括號[]操作者具有比引用操作*更高的優先級,以便需要將被迫與括號以匹配您需要的。否則,C將dest解釋爲指針數組,從dest+1(未定義的行爲)中讀取值並嘗試對其進行解引用(再次未定義的行爲)。