【问题标题】:Scope of a pointer in memory内存中指针的范围
【发布时间】:2021-09-17 17:05:09
【问题描述】:

过去几周我一直在学习 C,但我无法完全理解内存是如何管理指针的。

我的问题来自从这里获得的这个例子(第 17 页,共 19 页):C-Pointer-Basics

示例代码:

 #include <stdio.h>

 void F(int, int *);

 int main()
 {
     int m = 3;
     int n = 5;

     F(m, &n);

     printf("main: %d, %d\n", m, n); // print 3 7 (Where does the 7 came from?)

     return 0;
 }

 void F(int a, int *b)
 {
     /*
      * `a` being a local variable, gets cleaned after `F()` ends
      *  BUT how does `b` retain the value of `&a`?
      */

     a = 7;
     *b = a; // `*b = 7`
     b = &a; // `b` points to `a`
     *b = 4; // `a = 4` and why `*b` doesn't return 4?

     printf("F: %d, %d\n", a, *b); // print 4 4
 }

这里的问题是:

为什么当main()打印mn的值时,会显示m = 3n = 7

我的假设:

据我所知,指针超出了声明它的函数的范围,因此在void F(int a, int *b) 中,当不再需要该函数时,它会被销毁,与他的参数相同,但int *b 的值保留在内存中吗(即使int *b 不再存在)?因此,如果这是真的,我们可以从内存中“恢复”它并在main() 中使用它。

最好的,

【问题讨论】:

  • 这是使用调试器单步执行代码非常有用的地方。 7 来自*b = a;,您将 a 的内容复制到 b 指向的位置。
  • @Lundin,给建议的坦克,我会做一些像这样的测试,但是使用调试器,现在我明白了一点,更容易理解正在发生的事情指针的使用

标签: c pointers memory heap-memory stack-memory


【解决方案1】:

对于为什么mn 打印3,7 的问题是因为第一个参数是按值传递的,因此它只会被复制,因此不会对原始m 进行任何修改,并且在以下情况下n,你传递了它的地址,所以当你传递*b=a 时,a 的值被复制到 n。然后当您执行b=&amp;a 时,指针b 现在开始指向a 的地址,而不是n 的地址。这就是为什么你第二次做*b=4,你不是在修改n,而是a

【讨论】:

  • 真的非常感谢您的帮助,现在我明白发生了什么事情已经很明显了,再次感谢
  • 没问题@PaulS-Pou,我花了很长时间才掌握指针。我知道它会变得多么混乱。
猜你喜欢
  • 2011-07-22
  • 2017-06-22
  • 2011-02-26
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2014-03-13
相关资源
最近更新 更多