C 中的“中止陷阱:6”错误?

2024-03-03

我是 C 初学者,但我通过终端上的 gcc 在 xcode 上运行此代码:

#include <stdio.h>
#include <string.h> 
int main(){
    char name[12] = "Roman Mirov"; 
    printf("My name is %s\n", name);
    name[8] = 'k'; 
    printf("My name is %s\n", name);
    char greeting[] = "hello"; 
    printf("%s %s\n", greeting, name);
    strcpy(greeting, "greetings, "); 
    printf("%s%s\n", greeting, name);
    return 0;
}

它输出这个:

My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6

我的问题到底是,为什么它会生成错误而不是将最后一行显示为输出“问候,Roman Mikov”?


在这种情况下,目的地greeting没有足够的空间来包含全部内容source,所以这是一个调用的越界访问未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.

详细来说,数组的大小greeting由提供的初始值设定项的大小确定,

char greeting[] = "hello";

在这种情况下,"hello"这使得大小为 6,包括空终止符。

现在,稍后你尝试放一个更大的string进入记忆,

strcpy(greeting, "greetings, ");

其中,源的大小为 12 个字节,而目标的大小仅包含 6 个字节。这会导致边界溢出,结果为 UB。崩溃(或中止)是 UB 可能产生的副作用之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的“中止陷阱:6”错误? 的相关文章

随机推荐