2015-01-09 53 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"); 
}