【发布时间】: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()打印m和n的值时,会显示m = 3和n = 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