C++ 如何解决这个总线错误?

C++ 如何解决这个总线错误?,c++,bus-error,C++,Bus Error,下面的代码在一个程序中运行良好 在另一个系统中导致总线错误 char *temp1; temp1=(char*)malloc(2); for(b=3;b>=0;b--) { sprintf(temp1,"%02x",s_ip[b]); string temp2(temp1); temp.append(temp2); } s_ip[b]是字节类型,temp是字符串。是什么导致了这个总线错误?我

下面的代码在一个程序中运行良好 在另一个系统中导致总线错误

    char *temp1;
    temp1=(char*)malloc(2);
    for(b=3;b>=0;b--)
       {
       sprintf(temp1,"%02x",s_ip[b]);
       string temp2(temp1); 
       temp.append(temp2);
       } 
s_ip[b]是字节类型,temp是字符串。是什么导致了这个总线错误?我如何解决这个问题?
此外,这种奇怪行为的原因是什么?

缓冲区的长度必须为3个字符,因为
sprintf()
将在两个十六进制字符后附加一个空终止符:

char temp1[3];
似乎没有理由使用动态分配的内存。注意:您可以使用以下方法避免创建名为
temp2
的临时
字符串

另一种方法是避免使用
sprintf()
,并在IO操纵器中使用
std::ostringstream

#include <sstream>
#include <iomanip>

std::ostringstream s;

s << std::hex << std::setfill('0');

for (b = 3; b >= 0; b--)
{
    s << std::setw(2) << static_cast<int>(s_ip[b]);
}
#包括
#包括
std::ostringstream s;

S.P>一个具有2个字符的字符串实际上需要3个字节,因为在字符串末尾也有一个终止<代码> \ 0’/CODE。

注意到,根据SyIP[b]中的实际值,这可能比你所期望的2个数字写得多,所以你应该考虑使用一些安全性。snprintf@sjsam,
s_ip
是否有4个元素?@sjsam,那么
s_ip
的唯一有效索引是
0
1
,但是发布的
for
循环将访问
3,2,1,0
。将
for
循环更改为
for(b=1;b>=0;b--)
您尝试过调试它吗?SIGBUS应该会指出问题所在。@rtlgrmpf:这似乎是一件好事。他甚至可以通过调整字符串的大小()然后直接用snprintf写入字符串来避免任何临时聚合…@Plasmah,我认为这是未定义的行为?@Plasmah,你能发布你想要的代码吗?如果您直接修改
std::string
的内部结构,并说它缓存了它的大小,
std::string
实例不会失效吗?您只需要做一些事情N=s.size();s、 调整大小(N+p);r=snprintf(和s[N],p,blah);s、 调整大小(N+r);。我不知道你说的“缓存大小”是什么意思,我想这就是你的意思。我一直认为这是非法的。如果没有,那么我今天学到了一些东西。谢谢。我已经更改了它,但我仍然收到一个总线错误。是否有其他原因导致此错误??
#include <sstream>
#include <iomanip>

std::ostringstream s;

s << std::hex << std::setfill('0');

for (b = 3; b >= 0; b--)
{
    s << std::setw(2) << static_cast<int>(s_ip[b]);
}