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可能产生的副作用之一. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Oracle Database 9i, 10g闪回版本查询
- postgreSQL 储存地理位置600万性能测试笔记
- c# – 仅将ASP.NET MVC应用程序管理站点锁定到LocalHost
- c – 需要帮助调试从const char *到char * [-fpermissive]的
- Flex PopUpManager 弹出窗口居中
- 学习C,从书中寻找对该项目的澄清
- c# – 在给定时区的情况下,将datetime转换为UTC
- Flex 日志管理
- Sencha Touch的Ext.Ajax.request调用WebService方法实例
- c – 为什么std :: reference_wrapper不接受临时?