【发布时间】:2014-05-28 11:53:37
【问题描述】:
我有一个这样的程序(x86_64 GNU/Linux)
int main()
{
char s[] = "123456789";
char d[] = "123";
strcpy(d, s);
printf("%p, %0p\n", s, d);
printf("%s, %s", s, d);
return 0;
}
输出是:0xeb6d2930 0xeb6d2910 123456789 123456789 我对结果有点困惑 我觉得内存中的程序是这样的:
- '9','\0' 。 .
- '5','6','7','8'
- 0x7fff813af310: '1','2','3','4'
- 0x7fff813af300: '1','2','3','\0'
所以结果应该是 *s = "789", *d = "123456789"
你们能解释一下为什么结果不像我想的那样吗? 我将格式说明符更改为 %p 以打印 d 和 s 的地址 我知道 s 和 d 重叠所以没有足够的空间 d 持有 s 可能导致未定义的行为,但无论如何我想知道 为什么结果是 *s = "123456789" *d = "123456789"
【问题讨论】:
-
strcpy(d, s);BANG 在d中没有空格,用于所有s。您的程序受到Undefined Behaviour 的影响。 -
啊,是的,每天的“我正在将内容复制到一个没有指向足够有效内存的指针中”的问题。
标签: c printf undefined-behavior buffer-overflow strcpy