如何 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");
}
我正在尝试弄清楚如何从 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");
}