局部变量地址可以保留在返回指针的函数中吗

标签 c

#include<stdio.h>

int* a(int* b){
 int a = 20;
 printf("\n  \n");
 if(a == 20){
  printf("\n return from if a : 0x%x \n",a);
  return &a;
 }
 else{
  printf("\n returning from else b : 0x%x\n",b);
  return b;
 }
}

int main(){
 int n = 10;
 int *k,*m;
 k = &n;
 m = a(k);
 printf("\n m ; 0x%x m : %d \n",m,*m);
 return 0;
}

这里我返回函数返回指针的局部变量。在函数退出期间,所有变量都将从堆栈内存中移出,但函数如何仍然保留地址“a”处的值并打印数据?

对/对:

 return from if a : 0xbfd8cf14

 m ; 0xbfd8cf14 m : 20

地址保留在指针 m 中并正确打印值。我尝试更改不同的编号。

最佳答案

就是你的程序调用了未定义的行为。它可以免费打印任何东西(或崩溃,或做任何它想做的事)。

(也许这就是实际发生的事情:“从内存中删除”并不意味着保存变量的内存被破坏、着火或被魔术师使消失。它只是失效了。因为它是一个函数内的自动变量,最有可能发生的事情只是当函数返回时堆栈指针被移动,使变量无效但完好无损。不过,不要依赖于此。)

关于局部变量地址可以保留在返回指针的函数中吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903499/

相关文章:

c - 如何使用嵌套for循环计算多个平均值?

c - 我不明白这个例子中 fgets 的行为

c - 有什么方法可以找到关键部分中函数所花费的时间(在禁用和启用中断之间)

c - 在 C 中以 64 位整数存储值

c - 如何在 apache 2.2 服务器上运行 c 程序?

c++ - 如何通过 wprintf 函数打印 uint32_t 变量值?

C Linux : Global variable located in shared library as singleton

c++ - Gsoap 文件已留在@

c - 在结构内分配结构数组 (C)

c - 在简单的 GTK+ 应用程序中启用优化时出现段错误?