我的代码中有一个bug,是这样的。
char desc[25];
char name[20];
char address[20];
sprintf (desc, "%s %s", name, address);理想情况下,这应该会给出一个段错误。然而,我看到这给出了一个总线错误。维基百科说:“当程序试图访问未对齐的内存位置时,或者当您试图访问不存在或不允许访问的物理(非虚拟)内存位置时,就会出现总线错误。”
上述陈述的第二部分听起来类似于凹陷断层。所以我的问题是,什么时候会有SIGBUS,什么时候会有SIGSEGV?
编辑:-相当多的人提到了上下文。我不确定需要什么上下文,但这是一个缓冲区溢出,它位于一个静态类函数中,该函数从许多其他类函数调用。如果有什么我可以提供的更具体的东西会有所帮助,请尽管问。
无论如何,有人评论说,我应该写更好的代码。我想问这个问题的重点是“应用程序开发人员可以从SIGBUS和SIGSEGV中推断出什么吗?”(摘自下面的博客帖子)
发布于 2012-03-08 01:54:07
char desc[25];
char name[20];
char address[20];
sprintf (desc, "%s %s", name, address);仅通过查看这段代码,我就可以假设name和address都可以是20字符长度。如果是这样,那么这是否意味着desc应该是最小的20+20+1字符长度?(1字符表示name和address之间的空格,如sprintf中所指定的那样)。
这可能是segfault的一个原因。也可能有其他原因。例如,如果name比20字符更长怎么办?
所以最好使用std::string
std::string name;
std::string address;
std::string desc = name + " " + address;
char const *char_desc = desc.str(); //if at all you need thishttps://stackoverflow.com/questions/9606540
复制相似问题