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