首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这段代码没有出现分段错误?(总线错误)

为什么这段代码没有出现分段错误?(总线错误)
EN

Stack Overflow用户
提问于 2012-03-08 01:45:27
回答 6查看 484关注 0票数 4

我的代码中有一个bug,是这样的。

代码语言:javascript
运行
复制
char desc[25];
char name[20];
char address[20];
sprintf (desc, "%s %s", name, address);

理想情况下,这应该会给出一个段错误。然而,我看到这给出了一个总线错误。维基百科说:“当程序试图访问未对齐的内存位置时,或者当您试图访问不存在或不允许访问的物理(非虚拟)内存位置时,就会出现总线错误。”

上述陈述的第二部分听起来类似于凹陷断层。所以我的问题是,什么时候会有SIGBUS,什么时候会有SIGSEGV?

编辑:-相当多的人提到了上下文。我不确定需要什么上下文,但这是一个缓冲区溢出,它位于一个静态类函数中,该函数从许多其他类函数调用。如果有什么我可以提供的更具体的东西会有所帮助,请尽管问。

无论如何,有人评论说,我应该写更好的代码。我想问这个问题的重点是“应用程序开发人员可以从SIGBUS和SIGSEGV中推断出什么吗?”(摘自下面的博客帖子)

EN

Stack Overflow用户

发布于 2012-03-08 01:54:07

代码语言:javascript
运行
复制
char desc[25];
char name[20];
char address[20];
sprintf (desc, "%s %s", name, address);

仅通过查看这段代码,我就可以假设nameaddress都可以是20字符长度。如果是这样,那么这是否意味着desc应该是最小的20+20+1字符长度?(1字符表示nameaddress之间的空格,如sprintf中所指定的那样)。

这可能是segfault的一个原因。也可能有其他原因。例如,如果name20字符更长怎么办?

所以最好使用std::string

代码语言:javascript
运行
复制
std::string name;
std::string address;
std::string desc = name + " " + address;
char const *char_desc = desc.str(); //if at all you need this
票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9606540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档