返回栈区地址
#include <stdio.h>int *func() {int a = 10;return &a; // 函数调用完毕,因为a是局部变量,a释放}int main() {int *p = NULL;p = func();*p = 100; // 操作野指针指向的内存,errprintf("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 = 1static局部变量 j = 1static局部变量 j = 2static局部变量 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;}
