"Abort trap: 6" C 语言错误?

"Abort trap: 6" error in C?

我是 C 的初学者,但我在 xcode 上通过终端上的 gcc 获得了这段代码 运行:

#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

我的问题是,为什么它会产生错误而不是将最后一行显示为输出 "greetings, Roman Mikov"?

在这种情况下,目标 greeting 没有足够的 space 来包含 source 的全部内容,因此它是越界的调用 undefined behavior.

的访问

具体来说,数组 greeting 的大小由提供的初始值设定项的大小决定,

char greeting[] = "hello";

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

现在,稍后你尝试将更大的字符串放入内存,

strcpy(greeting, "greetings, ");

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

在这一行中,您将分配一个包含 5+1 个字符的数组:

char greeting[] = "hello";

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

strcpy(greeting, "greetings, ");

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

所以当你用strcpy(greeting, "greetings, ");复制"greetings, "greeting是不行的。因为 greeting 不足以包含具有 11+1 个字符的数组

=> 这里有错误 abort trap : 6