2012-10-22 96 views
0

我絕對是新來的C,我試圖初始化一個函數中的數組。在一個函數初始化數組

但它不起作用,因爲如果我想要在主要方法中打印值,我總會遇到分段錯誤。

static void array(int *i) 
{ 
    int j = 0; 
    i = (int *) malloc(5 * sizeof (int)); 
    for (j = 0; j < 5; j++) { 
     i[j] = j; 
    } 

    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
} 

/* Main entry point */ 
int main(int argc, char *argv[]) 
{ 
    int j; 
    int *i = NULL; 

    array(i); 
    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
    return 0; 
} 

如果有人能夠修復代碼並能解釋它是如何工作的,那會很好。

+3

'I =(INT *)malloc的(5 *的sizeof(int)的);'只會影響函數得到的指針副本,而不是調用方中的指針。讓我找到一個重複的。 –

+0

換句話說:指針作爲值傳遞,而不是作爲參考傳遞,因此不會更新。當你退出array()函數時,我的值得到了它的原始值。 – m0skit0

+0

請勿施放'malloc'的結果。 – chris

回答

3
static void array(int **i) 
{ 
    int j = 0; 
    *i = malloc(5 * sizeof (int)); 
    for (j = 0; j < 5; j++) { 
     (*i)[j] = j; 
    } 

    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", (*i)[j]); 
    } 
} 

/* Main entry point */ 
int main(int argc, char *argv[]) 
{ 
    int j; 
    int *i = NULL; 

    array(&i); 
    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
    return 0; 
} 

你傳入的指針由值到數組,所以你需要做的是一個指針傳遞給你的指針代替,然後設置/使用。


至於爲什麼你不應該投malloc分配的結果,請參見:Do I cast the result of malloc?Specifically, what's dangerous about casting the result of malloc?

+0

假設我們想複製另一個數組int int:memcpy(* i,j,5 * sizeof(int)); 爲什麼我必須在此功能中使用* i而不是我? – MeJ

+0

它不是已經在使用&我嗎? – farmdve

+0

不,我不得不使用*我,否則它不會工作,但爲什麼? 'array'中的 – MeJ

1

爲了從函數內部爲變量分配內存,必須將指針作爲函數參數傳遞給指針,對指針進行解引用,然後分配內存。

或僞代碼

function(int **i) 
{ 
    *i = malloc... 
} 
int *i = NULL; 
function(&i); 

這是做它的方式之一。你也可以返回malloc返回的指針。 而且,從我讀過的資料來看,不建立返回類型的malloc是一個好習慣。