返回栈区地址
#include <stdio.h>
int *func() {
int a = 10;
return &a; // 函数调用完毕,因为a是局部变量,a释放
}
int main() {
int *p = NULL;
p = func();
*p = 100; // 操作野指针指向的内存,err
printf("11111111111111111\n"); // 这句话可能执行不到,因为上一句话报错
return 0;
}
返回data区地址
int *func() { // 静态局部变量,只会初始化一次 static int a = 10; return &a; // 函数调用完毕,a不释放 }
int main() { int p = NULL; p = func(); p = 100; // ok printf(“p = %d\n”, p);
return 0;
}
- 普通局部变量和静态局部变量区别
- 存储位置:
- 普通局部变量存储在栈上
- 静态局部变量存储在静态存储区
- 生命周期:
- 当函数执行完毕时,普通局部变量会被销毁
- 静态局部变量的生命周期则是整个程序运行期间,即使函数调用结束,静态局部变量的值也会被保留
- 初始值:
- 普通局部变量在每次函数调用时都会被初始化,它们的初始值是不确定的,除非显式地进行初始化
- 静态局部变量在第一次函数调用时会被初始化,然后保持其值不变,直到程序结束
示例代码:
```c
#include <stdio.h>
void normal_func() {
int i = 0;
i++;
printf("局部变量 i = %d\n", i);
}
void static_func() {
static int j = 0;
j++;
printf("static局部变量 j = %d\n", j);
}
int main() {
// 调用3次normal_func()
normal_func();
normal_func();
normal_func();
// 调用3次static_func()
static_func();
static_func();
static_func();
return 0;
}
运行结果:
局部变量 i = 1
局部变量 i = 1
局部变量 i = 1
static局部变量 j = 1
static局部变量 j = 2
static局部变量 j = 3
返回堆区地址
#include <stdio.h>
#include <stdlib.h>
int *func() {
int *tmp = NULL;
// 堆区申请空间
tmp = (int *)malloc(sizeof(int));
*tmp = 100;
return tmp; // 返回堆区地址,函数调用完毕,不释放
}
int main() {
int *p = NULL;
p = func();
printf("*p = %d\n", *p); // ok
// 堆区空间,使用完毕,手动释放
if (p != NULL) {
free(p);
p = NULL;
}
return 0;
}