我是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;
}
Run Code Online (Sandbox Code Playgroud)
它输出这个:
My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
我的问题确切地说,为什么它产生错误而不是显示最后一行作为输出"问候,罗马Mikov"?
在这种情况下,目标greeting没有足够的空间来包含源的全部内容,因此它是一个超出边界的访问,它调用未定义的行为.
详细说明,数组greeting的大小由提供的初始化程序的大小决定,
char greeting[] = "hello";
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"hello"使大小为6,包括null终止符.
现在,稍后您尝试将更大的字符串放入内存中,
strcpy(greeting, "greetings, ");
Run Code Online (Sandbox Code Playgroud)
其中,源的大小为12字节,而目标只包含6.这会导致边界溢出,结果为UB.崩溃(或中止)是UB可能产生的副作用之一.