函数返回一个多次使用的数组,每次都给出相同的值

  • 本文关键字:数组 返回 一个 函数 c
  • 更新时间 :
  • 英文 :


我想创建一个返回int数组的函数。然而,我遇到了困难,因为这种尝试将为out1out2返回相同的值

int * foo(int bar) {
static int fizz[2] = {0, 0};
fizz[0] = bar;
fizz[1] = bar + 1;
return fizz;
}
int main() {
int *out1 = foo(1);
int *out2 = foo(2);
printf("(%d, %d)n(%d, %d)", out1[0], out1[1], out2[0], out2[1]);
}

输出:

(2, 3)
(2, 3)

然后这个解决方案不编译,因为我返回一个局部变量的地址(这就是导致我首先尝试static关键字的原因)。

int * foo(int bar) {
int fizz[2] = malloc(2*sizeof(int));
fizz[0] = bar;
fizz[1] = bar + 1;
return fizz;
}
int main() {
int *out1 = foo(1);
int *out2 = foo(2);
printf("(%d, %d)n(%d, %d)", out1[0], out1[1], out2[0], out2[1]);
}

所以我知道为什么这段代码不工作,但我不知道我可以尝试什么其他方法来成功地编写这个函数。

你的第二次尝试很接近了,而且肯定是在正确的道路上。然而,malloc函数的返回值是一个指针(而不是数组),并且fizz变量应该声明为这样(指向整数的指针,或int*)。

你对这个"返回一个局部变量的地址"的关注;在这种情况下是不相关的;返回的是的局部变量,它恰好是一个地址。该地址的值,由malloc返回,将被复制到函数返回的值

另外,当使用malloc时,永远不要忘记在使用完free函数时释放内存。

下面是一个工作代码示例,与第二个代码片段相比变化很小:
#include <stdio.h>
#include <stdlib.h>
int* foo(int bar)
{
int *fizz = malloc(2 * sizeof(int)); // Save the allocated pointer (locally)...
fizz[0] = bar;
fizz[1] = bar + 1;
return fizz;              // ... and return a COPY of the value of that address!
}
int main()
{
int* out1 = foo(1);
int* out2 = foo(2);
printf("(%d, %d)n(%d, %d)", out1[0], out1[1], out2[0], out2[1]);
// Don't forget to free the allocated memory...
free(out1);
free(out2);
}

您是否理解为什么您的第一个代码片段为out1out2提供相同的值并不是完全清楚。所以,以防万一:static int fizz[2]行声明了一个固定的内存块——尽管它只能通过名称从该函数内部访问。每次调用foo都将返回一个指向(相同)内存的指针,并且printf调用将显示最近一次(最新)更新中分配给其元素的值。

您的第一个代码也很好,只有在打印结果....

int* foo(int bar) {
static int fizz[2]={0,0};
fizz[0] = bar;
fizz[1] = bar + 1;
return fizz;
}
int main() {
int* out1=foo(1);
printf("%d,%dn", out1[0], out1[1]);
int* out2=foo(2);
printf("%d,%d n", out2[0], out2[1]);
return 0 ;
}

给出结果:

1,2
2,3

最新更新