我在处理 C 字符串时遇到了这种奇怪的行为。这是 K&R 书中的一个练习,我应该编写一个函数,将一个字符串附加到另一个字符串的末尾。这显然要求目标字符串分配足够的内存,以便源字符串适合。这是代码:
/* strcat: Copies contents of source at the end of dest */
char *strcat(char *dest, const char* source) {
char *d = dest;
// Move to the end of dest
while (*dest != '\0') {
dest++;
} // *dest is now '\0'
while (*source != '\0') {
*dest++ = *source++;
}
*dest = '\0';
return d;
}
在测试过程中,我编写了以下内容,预计程序运行时会发生段错误:
int main() {
char s1[] = "hello";
char s2[] = "eheheheheheh";
printf("%s\n", strcat(s1, s2));
}
据我了解 s1 得到一个 6 的数组chars
分配并 s2 为 13 的数组chars
。我以为当strcat
尝试在索引高于 6 处写入 s1 时,程序会出现段错误。相反,一切工作正常,但程序并没有干净地退出,而是:
helloeheheheheheh
zsh: abort ./a.out
并以代码 134 退出,我认为这只是意味着中止。
为什么我没有出现段错误(或者如果字符串分配在堆栈上,则覆盖 s2)?这些字符串在内存中的哪里(堆栈或堆)?
感谢您的帮助。
我认为当 strcat 尝试写入时s1
指数高于6
程序会出现段错误。
在堆栈上分配的内存范围之外写入是未定义的行为。调用这种未定义的行为通常(但并非总是)会导致段错误。然而,你不能sure会发生段错误。
维基百科链接解释得很好:
当发生未定义行为的实例时,就语言规范而言,任何事情都可能发生,也许什么也不会发生。
因此,在这种情况下,您可能会遇到段错误,程序可能会中止,或者有时它可能会正常运行。或者,任何东西。没有办法保证结果。
这些字符串在内存中的哪里(堆栈或堆)?
既然你已经将它们声明为char []
inside main()
,它们是具有自动存储,出于实际目的,这意味着它们在堆栈上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)