我是C的初学者,但我在终端上通过gcc在xcode上运行此代码:
//start time service
Intent intent = new Intent(this,TimeService.class);
startService(intent);
它输出:
#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;
}
我的问题确切地说,为什么它会产生错误而不是将最后一行显示为输出“问候,罗马米科夫”?
答案 0 :(得分:7)
在这种情况下,目标greeting
没有足够的空间来包含 source 的全部内容,因此它是一个调用undefined behavior的越界访问。
详细说明,数组greeting
的大小由提供的初始化程序的大小决定,
char greeting[] = "hello";
在这种情况下,"hello"
使大小为6,包括空终止符。
现在,稍后您尝试将更大的字符串放入内存中,
strcpy(greeting, "greetings, ");
其中,源的大小为12字节,而目标只包含6.这会导致边界溢出,结果为UB。崩溃(或中止)是UB可能产生的副作用之一。
答案 1 :(得分:0)
在这一行中,您将分配一个5 + 1个字符的数组:
char greeting[] = "hello";
在这一行中,您试图在该数组中写入11 + 1个字符:
strcpy(greeting, "greetings, ");
答案 2 :(得分:0)
在这种情况下,greeting
变量是char
的数组,大小为6(因为hello
和\0
)。
因此,当您使用strcpy(greeting, "greetings, ");
将"greetings, "
复制到greeting
时,则不能。因为greeting
不足以包含11+1
字符
=&GT;此处有错误abort trap : 6