1、栈空间的局部变量地址
只要是在函数{}中的变量都为局部变量,开辟在栈空间,当函数运行结束,会被释放掉。
#include <stdio.h>
int *func()
{
int arr[5] = {1, 2, 3, 4, 5};
return arr;
}
int main()
{
int * p = func();
return 0;
}
这是不合法的,因为arr在函数结束空间就会被释放,尽管此时返回了一个地址,但是所指向的数据空间被释放,会导致未知的错误。
2、堆空间的局部变量地址
#include <stdio.h>
int *func()
{
int *p = (int *)malloc(sizeof(int) * 5);
int arr[5] = {1, 2, 3, 4, 5};
p = arr;
return p;
}
int main()
{
int *p = func();
free(p);
return 0;
}
此时是合法的,因为使用malloc申请的内存是保存在堆空间,不会随着函数结束而结束,注意需要手动释放。