c. 中的局部变量和动态内存分配



你好,我正在学习基本的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的引用,该变量在函数返回时停止存在。

在第二段代码中,您将引用返回到动态分配的内存,该内存一直存在,直到您有意释放它或程序终止。