c - 如何从带有指针的函数返回数组

标签 c arrays function parameters return

我想弄清楚如何从 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

最佳答案

编辑: iharob 的回答比我的好。首先检查他的回答。

编辑 #2:我将尝试解释为什么你的代码是错误的

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

int *array[n];

让我们试着逆向阅读。
[n]

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

说你的数组叫做数组。
* array[n]

说你有一个指向数组的指针。指向的数组称为“数组”,大小为 n。
int * array[n];

表示您有一个指向大小为 n 的名为“array”的整数数组的指针。

在这一点上,您是创建二维数组的 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;

不为数组分配空间。在这一点上,它是一个不起眼的指针。那么,我们如何为数组分配空间呢?我们使用 malloc()
int * array = malloc(sizeof(int));

分配空间仅用于一个整数值 .在这一点上,它更像是一个变量而不是数组:

[0]
int * array  = malloc(sizeof(int) * n);

分配空间对于 n 个整数变量 ,使其成为一个数组:

例如n = 5:

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

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

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

你不能只返回这样的数组。您需要创建一个动态分配的数组才能做到这一点。另外,你为什么要使用二维数组?
int array[5];

基本上(不完全)与以下内容相同:
int * array = malloc(sizeof(int) * 5);

后者更灵活,因为您可以调整用 malloc 分配的内存大小,并且可以从函数返回指针,就像我发布的代码所做的那样。
不过要小心,因为如果你还没有准备好承受大量的痛苦和调试,动态内存分配是你不想进入的:)

此外,free() 任何在您使用完后已被 malloc 分配的内容,在使用已分配给它的指针之前,您应该始终检查 malloc() 的返回值。

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

关于c - 如何从带有指针的函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27852822/

相关文章:

c++ - 如何检查用户是否给出了正确的数据类型

c - 将相同的函数应用于C中数组中的每个元素

php - 通过函数传递 PHP 变量

c++ - 将数组传递给函数然后更改值?

function - Haskell 函数调用中的括号

在 while 循环中执行 scanf 后代码崩溃

对 C 中的 putchar 结果感到困惑

c++ - 如何更改以 50 为步长传递一些整数值到 C++ 代码

javascript - 将对象数组与 id 数组进行比较

javascript - Promise.all 可以接受所有非 Promise 元素的数组吗?