2015-01-09 81 views
2

我想弄清楚如何從main()中的函數返回數組。如何使用指針從函數返回數組

我正在使用C語言。

這是我的代碼。

#include <stdio.h> 

int *initArray(int n){ 
    int i; 
    int *array[n]; 

    for(i = 0; i < n; i++){ 
     array[i] = i*2; 
    } 

    return array; 
} 

main(){ 
    int i, n = 5; 
    int *array[n]; 

    array[n] = initArray(n); 

    printf("Here is the array: "); 

    for(i = 0; i < n; i++){ 
     printf("%d ", array[i]); 
    } 

    printf("\n\n"); 
} 

這是控制檯給我的錯誤:

2.c: In function ‘initArray’: 
2.c:8:13: warning: assignment makes pointer from integer without a cast [enabled by default] 
    array[i] = i*2; 
      ^
2.c:11:3: warning: return from incompatible pointer type [enabled by default] 
    return array; 
    ^
2.c:11:3: warning: function returns address of local variable [-Wreturn-local-addr] 
2.c: In function ‘main’: 
2.c:23:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("%d ", array[i]); 
    ^

這是不可能的! 我討厭一個小白:(

如果你能幫助,有解釋,我將不勝感激!d

+3

而不是編輯您的帖子來說「已解決」接受一個滿足您的需求的答案。 Upvote有幫助的答案。 – chux

+0

對不起,我是這個網站的新手。 我認爲每個答案都很好。 –

+0

而不是道歉,審查[我應該做什麼時,有人回答我的問題?](http://stackoverflow.com/help/someone-answers)請注意「請不要添加評論您的問題或答案說「謝謝」「 – chux

回答

1

如果你不想惹上麻煩學習malloc和動態內存分配你可以試試這個

#include <stdio.h> 

void initArray(int n, int array[n]) { 
    int i; 

    for (i = 0 ; i < n ; i++) { 
     array[i] = i * 2; 
    } 
} 

int main() { /* main should return int */ 
    int i, n = 5; 
    int array[n]; 

    initArray(n, array); 

    printf("Here is the array: "); 
    for(i = 0 ; i < n ; i++) { 
     printf("%d ", array[i]); 
    } 
    printf("\n\n"); 
    return 0; 
} 

爲你看,你不需要返回數組,如果你在main()中聲明它,並將它傳遞給函數,你可以直接修改函數中的值。

如果你想使用指針,然後

#include <stdio.h> 

int *initArray(int n) { 
    int i; 
    int *array; 

    array = malloc(n * sizeof(*array)); 
    if (array == NULL) /* you should always check malloc success */ 
     return NULL; 

    for (i = 0 ; i < n ; i++) { 
     array[i] = i * 2; 
    } 

    return array; 
} 

int main() { /* main should return int */ 
    int i, n = 5; 
    int *array; 

    array = initArray(n); 
    if (array == NULL) /* if null is returned, you can't dereference the pointer */ 
     return -1; 

    printf("Here is the array: "); 
    for(i = 0 ; i < n ; i++) { 
     printf("%d ", array[i]); 
    } 
    free(array); /* you sould free the malloced pointer or you will have a memory leak */ 
    printf("\n\n"); 

    return 0; 
} 
+0

你忘了在第二個例子中包含stdlib.h。此外,謝謝你是一個出色的運動,並幫助改善我的回答:) – Sky

8

編輯:。iharob的回答比我的好首先檢查他的回答

編輯#2:我要去嘗試解釋爲什麼你的代碼是錯誤的

考慮的主要在你的問題2號線():

int *array[n]; 

讓我們嘗試向後讀取它。

[n] 

表示我們有一個包含n個元素的數組。我們不知道這些元素是什麼類型,數組的名稱是什麼,但我們知道我們有一個大小爲n的數組。如果你的數組被稱爲數組,

* array[n] 

說你有一個指向數組的指針。被指向的數組稱爲'數組',其大小爲n。

int * array[n]; 

說你有一個指向大小爲n的整數數組的指針。

在這一點上,你是3/4製作2d數組的方法,因爲2d數組包含指向數組的指針列表。你不想那樣。

相反,你需要的是:

int * array; 

在這一點上,我們需要檢查你函數,initArray:

int *initArray(int n){ 
    int i; 
    int *array[n]; 

    for(i = 0; i < n; i++){ 
     array[i] = i*2; 
    } 

    return array; 
} 

initArray的第二行有同樣的錯誤,因爲第二主線。做它

int * array; 

現在,這裏來的部分是很難解釋。

int * array; 

不爲陣列分配空間。在這一點上,這是一個卑微的指針。那麼,我們如何爲數組分配空間?我們使用malloc()

int * array = malloc(sizeof(int)); 

分配空間只有一個整數值。在這一點上,它是一個多陣列的變量:

[0]

int * array = malloc(sizeof(int) * n); 

分配空間對於n整數變量,使它成爲一個陣列:

例如N = 5:

[0] [0] [0] [0] [0]

注:真正的數組中的值可能是垃圾值,因爲malloc不歸零存儲器,不像calloc。 0是爲了簡單。

然而,malloc的總不工作,這就是爲什麼你需要檢查它的返回值: (的malloc將使陣列= NULL如果不成功)

if (array == NULL) 
    return NULL; 

然後,您需要檢查initArray的值。

#include <stdio.h> 
#include <stdlib.h> 
int *initArray(int n){ 
    int i; 
    int *array = malloc(sizeof(int) * n); 
    if (array == NULL) 
     return NULL; 

    for(i = 0; i < n; i++){ 

     array[i] = i*2; 
    } 

    return array; 
} 

int main(){ 
    int i, n = 5; 
    int *array = initArray(n); 
    if (array == NULL) 
     return 1; 

    printf("Here is the array: "); 

    for(i = 0; i < n; i++){ 
     printf("%d ", array[i]); 
    } 
    free(array); 

    printf("\n\n"); 
    return 0; 
} 

你不能只是返回這樣一個數組。你需要製作一個動態分配的數組才能做到這一點。另外,爲什麼你仍然使用二維數組?

int array[5]; 

基本上是(不完全)一樣:

int * array = malloc(sizeof(int) * 5); 

後者更靈活,因爲一點你可以調整這是使用malloc分配的內存,你可以返回從函數指針,就像我發佈的代碼一樣。 但是,要小心,因爲動態內存分配是你不想進入,如果你沒有準備好噸的痛苦和調試:)

此外,免費()任何已經malloc'd後在使用它之前,你應該總是檢查malloc()的返回值,然後再使用已經分配的指針。

感謝iharob提醒我這包括在回答

+0

沒有討論'free()'數組。 OP可能會誤解數組語法,並且不知道2d數組是什麼。 –

+0

@Sky你看到你有錯誤嗎? –

+0

@iharob是的,我看到了修復它們的錯誤 – Sky

2

是否要初始化數組?你可以嘗試這樣。

#include <stdio.h> 
void initArray(int *p,int n) 
{ 
    int i; 
    for(i = 0; i < n; i++) 
    { 
     *(p+i) = i*2; 
    } 

} 

void main(void) 
{ 
    int i, n = 5; 
    int array[n]; 

    initArray(array,n); 

    printf("Here is the array: "); 

    for(i = 0; i < n; i++) 
    { 
     printf("%d ", array[i]); 
    } 

    printf("\n\n"); 
}