不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
#include<stdio.h>
int* test()
{
int a = 10;
return &a; //&a=0x0012ff40
}
int main()
{
int* p = test();
return 0;
}
test
函数返回了局部变量 a
的地址。由于 a
是一个局部变量,所以这个地址是无效的。当 test
函数执行完毕并返回时,a
所占用的内存已经被释放了。
如果你尝试使用这个返回的指针来访问或修改该内存位置,会导致未定义的行为,可能引发运行时错误,甚至导致程序崩溃。
改正:
#include <stdio.h>
#include <stdlib.h>
int* test() {
int* arr = (int*)malloc(sizeof(int)); // 动态分配内存
if (arr == NULL) {
printf("Memory allocation failed!\n");
exit(1); // 错误处理
}
*arr = 10; // 为分配的内存赋值
return arr; // 返回指针
}
int main() {
int* p = test();
printf("%d\n", *p); // 输出 10
free(p); // 释放内存
return 0;
}
#include <stdio.h>
int a; // 全局变量
int* test() {
a = 10; // 修改全局变量
return &a; // 返回全局变量的地址
}
int main() {
int* p = test();
printf("%d\n", *p); // 输出 10
return 0;
}