c - 函数局部变量在每次调用中的相同地址

标签 c memory

<分区>

我试图在这样的代码中查找错误:

char *** read_set(char * filename)
{
  int ch;
  while(ch!=EOF)
  {
    //code...
  }
    //mode code...
}

在第一次调用中它按预期工作,但在第二次调用中 ch 是 EOF(-1)。我当然应该初始化它,但我没想到局部变量会被分配相同的地址。这是经常发生的事情还是取决于操作系统/编译器等?

最佳答案

这是正常的,尤其是当您多次从同一个调用者调用该函数时,例如

read_set("foo");
read_set("bar");
read_set("baz");

for (i = 0; i < 5; ++i) {
  read_set(filenames[i]);
}

堆栈包含每个事件函数调用(从main 开始)的返回地址、帧指针、局部变量、参数值和临时值。所有这些对于每个函数都有固定的大小是很常见的,所以如果函数 A() 在堆栈上需要 40 个字节,函数 B() 需要 20 个字节,函数 C() 需要 1000 个字节,那么在以下两种情况下read_set 的局部变量(例如 &ch)通常在同一个地址上:

  1. main() 调用 C(),C() 调用 B(),B() 再次调用 B(),内部 B() 调用 read_set()。

  2. main() 调用 C(),C() 调用 A(),A() 调用 read_set()。

请注意,根据编译器和体系结构,您可能会获得不同的地址。但是获得相同的地址并不罕见。

请注意,地址空间随机化等某些安全功能可能会在您每次再次运行该程序时为您提供不同的地址。但在同一次运行中,您会获得相同的地址。

关于c - 函数局部变量在每次调用中的相同地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876978/

相关文章:

java - Java 8 中的字符串使用多少内存?

c++ - Cuda - 从设备全局内存复制到纹理内存

c# - RenderTargetBitmap 内存泄漏

C中的cd命令用法

c - 为什么我的 C 程序应该输出 n 次方矩阵,却输出 2^n 次方矩阵?

c - 使用 mercurial 存储二进制文件 w.r.t 回归测试

c# - 为什么要处理一个肯定会很快被处理掉的对象呢?

c# - 哈希表 - 内存不足

c - 动态字符串输入 - 使用 scanf ("%as")

c - C d_name[256] 和 NAME_MAX 定义中的 struct dirent