返回栈区地址

  1. #include <stdio.h>
  2. int *func() {
  3. int a = 10;
  4. return &a; // 函数调用完毕,因为a是局部变量,a释放
  5. }
  6. int main() {
  7. int *p = NULL;
  8. p = func();
  9. *p = 100; // 操作野指针指向的内存,err
  10. printf("11111111111111111\n"); // 这句话可能执行不到,因为上一句话报错
  11. return 0;
  12. }

返回data区地址

  • 在函数内部使用static修饰的变量称为静态局部变量
  • 它在程序运行期间只被初始化一次,并且在函数调用结束后也不会被销毁 ```c

    include

int *func() { // 静态局部变量,只会初始化一次 static int a = 10; return &a; // 函数调用完毕,a不释放 }

int main() { int p = NULL; p = func(); p = 100; // ok printf(“p = %d\n”, p);

  1. return 0;

}

  1. - 普通局部变量和静态局部变量区别
  2. - 存储位置:
  3. - 普通局部变量存储在栈上
  4. - 静态局部变量存储在静态存储区
  5. - 生命周期:
  6. - 当函数执行完毕时,普通局部变量会被销毁
  7. - 静态局部变量的生命周期则是整个程序运行期间,即使函数调用结束,静态局部变量的值也会被保留
  8. - 初始值:
  9. - 普通局部变量在每次函数调用时都会被初始化,它们的初始值是不确定的,除非显式地进行初始化
  10. - 静态局部变量在第一次函数调用时会被初始化,然后保持其值不变,直到程序结束
  11. 示例代码:
  12. ```c
  13. #include <stdio.h>
  14. void normal_func() {
  15. int i = 0;
  16. i++;
  17. printf("局部变量 i = %d\n", i);
  18. }
  19. void static_func() {
  20. static int j = 0;
  21. j++;
  22. printf("static局部变量 j = %d\n", j);
  23. }
  24. int main() {
  25. // 调用3次normal_func()
  26. normal_func();
  27. normal_func();
  28. normal_func();
  29. // 调用3次static_func()
  30. static_func();
  31. static_func();
  32. static_func();
  33. return 0;
  34. }

运行结果:

  1. 局部变量 i = 1
  2. 局部变量 i = 1
  3. 局部变量 i = 1
  4. static局部变量 j = 1
  5. static局部变量 j = 2
  6. static局部变量 j = 3

返回堆区地址

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int *func() {
  4. int *tmp = NULL;
  5. // 堆区申请空间
  6. tmp = (int *)malloc(sizeof(int));
  7. *tmp = 100;
  8. return tmp; // 返回堆区地址,函数调用完毕,不释放
  9. }
  10. int main() {
  11. int *p = NULL;
  12. p = func();
  13. printf("*p = %d\n", *p); // ok
  14. // 堆区空间,使用完毕,手动释放
  15. if (p != NULL) {
  16. free(p);
  17. p = NULL;
  18. }
  19. return 0;
  20. }