2017-07-17 91 views
1

我需要分配一個malloc數組,我必須從輸入讀取一些數字。這是我的代碼:指針指針數組&堆棧粉碎錯誤

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

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     array[i]=&tmp[i]; 
    } 
} 

//DO NOT EDIT main() 
int main() 
{ 
    int *array; 
    int array_size,i; 

    read(&array,&array_size); 

    printf("Print array:\n"); 
    for(i=0;i<array_size;i++) 
     printf("%d\n", array[i]); 

    return 0; 
} 

它有點兒工作,但顯示值之後它顯示了一個堆棧溢出檢測(我使用GCC編譯它)。

我認爲問題是*array=malloc(*array_size*sizeof(int)),但我不知道如何解決它。有沒有另一種方式來分配這個數組而不編輯main()?謝謝。

+0

Array_size甚至沒有初始化... –

+2

順便說一下'#include'是MCVE絕對必需的。缺少'''malloc'將會在64位平臺上出現嚴重錯誤。 –

+0

@TonyTannous考慮scanf成功.....沒關係。 –

回答

4

問題是你索引錯誤數組。你應該寫(*array)[i],不array[i]

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     (*array)[i]=tmp[i]; 
    } 
} 

當然,這一切都是非常複雜的 - 你不必實際上有tmp,你也不需要malloc它。相反,你很可能會做這樣的事情

void read(int **array, int *array_size) { 
    int i, *pos; 
    scanf("%d", array_size); 
    *array = pos = malloc(*array_size * sizeof(int)); 
    for (i = 0; i < *array_size; i ++, pos ++) { 
     scanf("%d", pos); 
    } 
} 

這是我們擁有的指針pos指向我們想要scanf下一個整數數組中的當前位置。在每個循環中,我們增加位置。

當然,你想要檢查這些scanf s和malloc的返回值;或許read應該有不同的原型,如

int *read(int *array_size); 

,因此它可以將指針返回到直接在陣列,或關於錯誤NULL。