如何从带有指针的函数返回数组
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。另外,感谢您成为一项出色的运动并帮助改善我的答案:)以上是关于如何从带有指针的函数返回数组的主要内容,如果未能解决你的问题,请参考以下文章