繁体   English   中英

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

[英]“Abort trap: 6” error in C?

我是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

我的问题确切地说,为什么它产生错误而不是显示最后一行作为输出“问候,罗马Mikov”?

在这种情况下,目标greeting没有足够的空间来包含的全部内容,因此它是一个超出范围的访问,它调用未定义的行为

详细说明,数组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\\0 )。

所以当你使用strcpy(greeting, "greetings, "); "greetings, "复制成greeting是不可能的。 因为greeting不足以包含11+1字符的数组

=>错误abort trap : 6这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM