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

Posted

技术标签:

【中文标题】如何从带有指针的函数返回数组【英文标题】:How to return an array from a function with pointers 【发布时间】:2015-03-07 07:36:40 【问题描述】:

我正试图弄清楚如何从 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

【问题讨论】:

而不是编辑您的帖子说“已解决”接受完全满足您需求的答案。为有帮助的答案点赞。 对不起,我是这个网站的新手。我认为每个答案都很好。 与其道歉,不如回顾What should I do when someone answers my question? 请注意“请不要对您的问题或回答说“谢谢”添加评论” 【参考方案1】:

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

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

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

int *array[n];

让我们试着倒着读。

[n]

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

array[n] 

说你的数组叫做数组。

* array[n]

说你有一个指向数组的指针。指向的数组称为“数组”,大小为 n。

int * array[n];

说你有一个指向整数数组的指针,称为“数组”,大小为 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;

不为数组分配空间。在这一点上,它是一个不起眼的指针。那么,我们如何为数组分配空间呢?我们使用 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 将使 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 提醒我将其包含在答案中

【讨论】:

没有讨论free()ing 数组。 OP 可能误解了数组语法并且不知道二维数组是什么。 @iharob 是的,我看到了错误,感谢您修复它们 @Sky 如果我使用它,控制台会给我新的错误:2.c: In function 'main': 2.c:23:9: error: incompatible types when assignment to type 'int *[(sizetype)(n)]' from type 'int *' array = initArray(n); ^ @DrenSkywalker 你应该声明这样的数组int *array; 而不是int *array[n]; @DrenSkywalker 您是否完全复制了我的代码?在您更新的问题中,我看到: int *array[n];它应该是 int *array = initArray(n);【参考方案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");

【讨论】:

【参考方案3】:

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

【讨论】:

第二个示例您忘记包含 stdlib.h。另外,感谢您成为一项出色的运动并帮助改善我的答案:)

以上是关于如何从带有指针的函数返回数组的主要内容,如果未能解决你的问题,请参考以下文章

从指向函数指针数组的指针中存储返回值如何工作?

如何创建带有参数的成员函数指针数组?

如何正确传递带有指向函数的指针的数组?

指针的高阶用法——从函数返回指针

C 从函数返回指针

C 从函数返回指针