"Abort trap: 6" C 中的错误?



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

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

,它输出了以下内容:

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

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

在这种情况下,目标greeting没有足够的空间包含 source 的整个内容,因此它是一个范围访问,可以调用未定义的行为。

要详细说明,数组 greeting的大小由提供的初始化器的大小

确定
char greeting[] = "hello";

在这种情况下,"hello"的大小为6,包括null末端。

现在,后来您尝试将更大的字符串进入内存,

strcpy(greeting, "greetings, ");

在哪里,源的大小为12个字节,而目的地仅包含6。这导致边界超越,结果UB。崩溃(或流产)是UB的可能副作用之一。

在这一行中,您要分配5 1个字符的数组:

char greeting[] = "hello";

在这一行中,您正在尝试将11 1个字符写入该数组:

strcpy(greeting, "greetings, ");

在这种情况下, greeting变量是 char的数组,大小为6(因为 hello)。

因此,当您使用strcpy(greeting, "greetings, ");"greetings, "复制到greeting中时。因为greeting不足以包含 11+1字符

的数组

=>有错误 abort trap : 6在这里

最新更新