【发布时间】:2015-07-22 21:11:13
【问题描述】:
在下面的代码中,什么都打印失败的解释是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 - 地址的较小大小是否意味着什么?)在整个代码中保持不变。找出为什么这会改变行为会很酷
【问题讨论】:
-
为什么没有输出?您调用了未定义的行为。
-
数组不是指针。
-
@Olaf:虽然这是真的,但我看不出它与这里有什么关系。
-
@undur_gongor:OP 返回一个本地数组。如果
msg是一个指针,它会起作用。 -
@undur_gongor:感谢您提供的信息。我不说返回类型,而是
msg。试试char *msg = "Hello"; return msg;。根据他的其余问题,OP混淆了指针和数组:“......超出范围的指针的数据......”指针的数据是它指向的地址。数组的数据就是内容。