如何 return 带有指针的函数中的数组

How to return an array from a function with pointers

我正在尝试弄清楚如何从 main() 中的函数 return 数组。

我用的是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

编辑:iharob 的回答比我的好。先看看他的回答。

编辑 #2:我将尝试解释您的代码错误的原因

考虑问题中 main() 的第二行:

int *array[n];

让我们试着倒着读。

[n]

表示我们有一个包含 n 个元素的数组。我们不知道这些元素是什么类型以及数组的名称是什么,但我们知道我们有一个大小为 n 的数组。

array[n] 

说你的数组叫数组。

* array[n]

表示您有一个指向数组的指针。指向的数组称为 'array',大小为 n.

int * array[n];

说你有一个指针指向一个名为 'array' 的整数数组,大小为 n。

至此,您已经完成了创建二维数组的 3/4,因为二维数组由指向数组的指针列表组成。你不想要那个。

相反,您需要的是:

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第二行和main第二行一样的错误。成功

int * array;

下面是比较难解释的部分。

int * array;

不为数组分配 space。在这一点上,它是一个不起眼的指针。那么,我们如何为一个数组分配space呢?我们使用 malloc()

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

仅分配 space 一个整数值 。在这一点上,它更像是一个变量而不是一个数组:

[0]

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

分配spacen个整型变量,使其成为一个数组:

例如n = 5:

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

注意:实际数组中的值可能是垃圾值,因为 malloc 不会将内存清零,这与 calloc 不同。 0 是为了简单起见。

然而,malloc 并不总是有效,这就是为什么您需要检查它的 return 值: (如果不成功,malloc 将使 array = 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;
}

你不能只 return 这样的数组。为此,您需要创建一个动态分配的数组。另外,你为什么要使用二维数组?

int array[5];

基本上(不完全)与:

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

后者更灵活一些,因为您可以调整使用 malloc 分配的内存的大小,并且可以 return 来自函数的指针,就像我发布的代码所做的那样。 但是要当心,因为如果您还没有准备好承受大量的痛苦和调试,那么动态内存分配是您不想参与的事情:)

此外,free() 任何在你使用完之后被 malloc 的东西,你应该在使用分配给它的指针之前总是检查 malloc() 的 return 值.

感谢 iharob 提醒我将其包含在答案中

如果您不想在学习 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;
}

如你所见,你不需要 return 数组,如果你在 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;
}

是否要初始化数组?你可以这样试试。

#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");
}