你好,我正在学习基本的c编程,理解这些代码的行为有点困难。
这是第一个:
#include <stdio.h>
#include <stdlib.h>
int* foo(int start) {
int arr[3];
arr[0] = start;
arr[1] = start+1;
arr[2] = start+2;
int* ret = arr;
return ret;
}
int main() {
int* a1 = foo(0);
int* a2 = foo(3);
printf("a1 = [%d, %d, %d]n", a1[0], a1[1], a1[2]);
printf("a2 = [%d, %d, %d]n", a2[0], a2[1], a2[2]);
return 0;
}
我期望这个输出
a1 = [0,1,2]
a2 = [3,4,5],但是它输出
a1 = [3, 4, 5]
a2 = [32766, -463722864, 32766]
这样的。但是当我把代码改成;
int* foo(int start) {
int* arr = (int*) malloc(3*sizeof(int));
arr[0] = start;
arr[1] = start+1;
arr[2] = start+2;
int* ret = arr;
return ret;
}
它工作如我所料。为什么第一个不工作?我想知道为什么会这样。谢谢你
在第一个代码中,您返回对局部变量arr
的引用,该变量在函数返回时停止存在。
在第二段代码中,您将引用返回到动态分配的内存,该内存一直存在,直到您有意释放它或程序终止。