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