0

以下代码在一个程序中运行良好,但在另一个程序中导致总线错误

    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] 是 byte 类型, temp 是一个字符串。是什么导致了这个总线错误,我该如何解决这个问题?此外,这种奇怪行为的原因是什么?

4

2 回答 2

6

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

char temp1[3];

似乎没有理由使用动态分配的内存。请注意,您可以避免使用以下命令创建临时string命名:temp2std::string::append()

temp.append(temp1, 2);

另一种方法是避免使用sprintf()a并将其std::ostringstream与 IO 操纵器一起使用:

#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]);
}

然后用于s.str()获取std::string实例。

于 2012-09-11T10:54:51.150 回答
3

'\0'一个有 2 个字符的字符串实际上需要 3 个字节,因为在字符串的末尾还有一个终止符。

于 2012-09-11T10:55:10.743 回答