首页 > 解决方案 > 内存中指针的范围

问题描述

过去几周我一直在研究 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()打印 and 的值时mn它显示m = 3and n = 7

我的假设:

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

最好的,

标签: cpointersmemoryheap-memorystack-memory

解决方案


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


推荐阅读