C中的“中止陷阱:6”错误?
我是C的初学者,但我在终端上通过gcc在xcode上运行此代码:
#include #include 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
这里