【发布时间】:2017-11-15 17:04:15
【问题描述】:
用了一段时间的C++编程,最近又开始用C编程了,对指针的理解有点生疏了。
我想问一下为什么这段代码没有导致任何错误:
char* a = NULL;
{
char* b = "stackoverflow";
a = b;
}
puts(a);
我认为因为b 超出范围,a 应该引用一个不存在的内存位置,因此它们在调用printf 时会出现运行时错误。
我在 MSVC 中运行了这段代码大约 20 次,没有出现任何错误。
【问题讨论】:
-
这不是未定义的。字符串文字是静态分配的。这段代码非常好。
-
换句话说,
b已经超出范围,但不是它所指向的范围。 -
OTOH,如果您改为:
char b[] = { 's', 't', 'a', 'c', 'k', 'o', 'v', 'e', 'r', 'f', 'l', 'o', 'w', '\0' }.,则行为将未定义 -
@DavidBowling 甚至
char b[] = "stackoverflow"; -
@CometEngine 他们可能会坐在
.rodata甚至.text部分。
标签: c