【发布时间】:2018-09-02 06:16:41
【问题描述】:
如果你有这样一行代码
int num = 4;
这会导致以下表格吗?
VARIABLE|ADDRESS ADDRESS|VALUE
num |0001 0001 |4
如果你要那么说
int* num_p = #
这会导致以下表格吗?
VARIABLE|ADDRESS ADDRESS|VALUE
num |0001 0001 |4
num_p |0002 0002 |0001
然后会说
int** num_pp = &num_p;
结果如下表?
VARIABLE|ADDRESS ADDRESS|VALUE
num |0001 0001 |4
num_p |0002 0002 |0001
num_pp |0003 0003 |0002
等等?如果是这样,如果初始变量不是int 而是struct,同样的逻辑是否成立?
编辑:查看有关此问题的 cmets 以了解地址的实际外观,而不是 0001、0002、0003 方案。
编辑 2:This answer to this question 指出变量不一定必须有地址这一事实。 This answer to an earlier question 也参与其中。
【问题讨论】:
-
大致:是的。除了你的地址自然是无稽之谈,它们的偏移量会随着使用的变量的大小而变化。您应该编写一个程序,然后找到链接器映射文件输出,看看您的变量在哪里结束。
-
嗯,不完全是。许多处理器上的内存是字节可寻址的,“地址”是一个字节地址。通常,块中的地址被描述为从 0 开始,而不是 1,因此“num”将位于地址“0000”,并且由于 int var 通常占用 4/8 个字节,“num_p”将从 0004/0008 开始。
-
@Lundin 哦,我不知道你能做到这一点。我一定会尝试的。
-
@MartinJames 好的,这是有道理的。感谢您的澄清。
-
@NetherGranite 好吧,取决于编译器和系统,地图文件可能有意义,也可能没有意义。在某些系统上,它只显示链接器将各种 .o 文件的输出转储到何处,这并不是很有趣。
标签: c pointers variables memory