我想创建一个返回int数组的函数。然而,我遇到了困难,因为这种尝试将为out1
和out2
返回相同的值
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);
}
您是否理解为什么您的第一个代码片段为out1
和out2
提供相同的值并不是完全清楚。所以,以防万一: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