在以下代码中,无法打印任何内容的解释是 get_message() 返回的指针超出范围:
char *get_message() {
char msg [] = "Aren’t pointers fun?";
return msg ;
}
int main (void) {
char *foo = get_message();
puts(foo);
return 0;
}
在gdb中运行,发现foo位置的数据是字符串“Aren't pointers fun?”:
Old value = 0x0
New value = 0x7fffffffde60 "Aren’t pointers fun?"
(这似乎与指出超出范围的指针的数据保留在内存中的答案一致),但“puts”的文档指出第一个数据是从给定的地址复制的:在这种情况下可能是 0x7fffffffde60。
因此:为什么什么都没有输出?
编辑:感谢您的回答:我在 gdb 中运行原始代码以完成,对 puts 的调用确实更改了 foo 存储地址处的数据。
(gdb) p foo
$1 = 0x7fffffffde60 "Aren’t pointers fun?"
(gdb) n
11 return 0;
(gdb) p foo
$2 = 0x7fffffffde60 "`\336\377\377\377\177"
有趣的是,当我将 change_msg() 的代码更改为:
char *get_message() {
char *msg = "Aren’t pointers fun?";
return msg ;
}
在这种情况下,foo 处的数据(地址 0x4005f4 - 地址的较小大小是否意味着什么?)在整个代码中保持不变。找出为什么这会改变行为会很酷