【发布时间】:2014-11-04 18:10:07
【问题描述】:
我在 C 课程中进行了编程练习,并遵循了以下问题:
buf(主函数中的局部变量)的地址是什么?以十六进制格式(0x 后跟 8 个“数字”0-9 或 a-f,如 0xbfff0014)或十进制格式输入答案。注意这里我们要的是 buf 的地址,而不是它的内容。
代码如下:
int main(int argc, char *argv[]) {
while(1) {
char buf[1024] = {0};
int r;
....
所以我运行gdb 并简单地将断点放在char buf[1024] 行并输入gdb
p &buf
这给了我一个结果:0xbffff0f0
但是当我在这个测验中使用这个数字时,它给我的结果是这个值不正确。
我的问题是:这是 buf 变量的 (p &buf) 地址吗?或者如果没有,为什么不呢?
练习是在准备好 VirtualBox 的机器上进行的,所以我认为每个人都应该有相同的地址
【问题讨论】:
-
对,就是
buf的地址。不,该地址不能保证是0xbffff0f0(它在不同的计算机上可能不同;哎呀,它甚至可能因程序在同一台计算机上的不同运行而不同!)。如果你有一个测验问你这个问题,那么测验中可能有更多你没有说明的限制或假设。 -
是的,
p打印一个表达式,&buf是缓冲区的表达式。做那个测验的人是个白痴(除非他们把所有事情都搞定并使用确定性的实现),因为那个地址对于测验来说太脆弱了。它可以随时改变。 -
buf 已经是一个指针。你正在取它的地址。在 gdb 中使用 p buf 代替。
-
@JewelThief: 否,
buf是一个数组,不是一个指针。 -
@JewelThief:在大多数情况下,数组衰减为指向其第一个元素的指针(知道它不知道的地方!)。当我们这样吹毛求疵时,我们并不是受虐狂或虐待狂,这对于理解什么是什么以及避免错误的概括至关重要。马虎的命名法和编码会导致错误。
标签: c pointers gdb memory-address