加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的“中止陷阱:6”错误?

发布时间:2020-12-16 10:04:51 所属栏目:百科 来源:网络整理
导读:我是C的初学者,但我在终端上通过 gcc在 xcode上运行此代码: #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";
我是C的初学者,但我在终端上通过 gcc在 xcode上运行此代码:

#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",name);
    return 0;
}

它输出这个:

My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6

我的问题确切地说,为什么它产生错误而不是显示最后一行作为输出“问候,罗马Mikov”?

解决方法

在这种情况下,目标问候语没有足够的空间来包含源的全部内容,因此它是一个调用 undefined behavior的越界访问.

详细说明,数组问候语的大小由提供的初始化程序的大小决定,

char greeting[] = "hello";

在这种情况下,“hello”使大小为6,包括null终止符.

现在,稍后您尝试将更大的字符串放入内存中,

strcpy(greeting,");

其中,源的大小为12字节,而目标只包含6.这会导致边界溢出,结果为UB.崩溃(或中止)是UB可能产生的副作用之一.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读