C++ 从 unsigned char* 到 stringstream:分段错误(核心转储)错误 [关闭]

Posted

技术标签:

【中文标题】C++ 从 unsigned char* 到 stringstream:分段错误(核心转储)错误 [关闭]【英文标题】:C++ from unsigned char* to stringstream: Segmentation fault (core dumped) error [closed] 【发布时间】:2014-04-17 15:42:13 【问题描述】:

我正在编写 C++ 代码并尝试使用 stringstreamunsigned char* 数组转换为 string

代码sn-p:

 unsigned char * arr;
 do
    fill(*arr); 
    //if I print the array here, the print operation works fine
    stringstream s((const char*)arr); //I also tired other castings without success
    cout<<s.str()<<endl;

   //condition...
 while(condition);

do-while 因为我必须重复它。问题是我在这里收到分段错误(核心转储)错误:stringstream s((const char*)arr);


这是一个更详细的代码。 filllibusb_interrupt_transfer

int len = 64;
int transferred;
unsigned char *pkt = new unsigned char[len];
unsigned char * arr;
int arrLen;

do 
    libusb_interrupt_transfer(handle, (EP_IN | LIBUSB_ENDPOINT_IN), pkt, len, &transferred, 1000);

    arrLen = pkt[6];
    arr = new unsigned char[arrLen];
    for (int i = 0; i < arrLen; i++) 
        arr[i] = pkt[i+7];
    
    stringstream s;
    s << (char*) arr;

【问题讨论】:

什么是“ret”?你是说“arr”吗? 你有没有初始化过arrfill 是做什么的? 我们是否可以假设在某个时候,您实际上为arr 分配了内存以指向(例如arr = new unsigned char[&lt;something&gt;])?否则,它可能指向任何东西或什么都没有并调用未定义的行为......同样,如果arr 指向的内存不是以空值终止的...... 请提供您的fill() 方法。当我用 clear new[] 初始化它时,它可以正常工作。此外,您似乎没有delete[] @Michał 是对的——我们需要查看更多代码。由于信息不足,该问题有可能关闭。 【参考方案1】:

我会选择:

stringstream s;
s << (char*) arr;

编辑:

好的,所以在您给我们Fill() 之后,我认为这就是问题所在:

基于此链接:http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486,您可以永远假设您将拥有len 中传递的字符数量。您应该使用您的transferred 检查已传输的字符数。

直接问题在于你写的那一刻

arrLen = pkt[6];

因为很可能 pkt[6] 没有被初始化。在这种情况下,它包含一些随机数(如果我们假设该数字是真正随机的)会给你一个 1 到 2^31 - (64 - 7) 的访问冲突概率 - 如果@987654327 @太大了,你会很快超过pkt范围。

所以我会建议这样的事情:

libusb_interrupt_transfer(handle, (EP_IN | LIBUSB_ENDPOINT_IN), pkt, len, &transferred, 1000);

// AHTUNG! ATTENTION!
if (transferred >= 7) // and you'll need even more
    continue;
arrLen = pkt[6];
arr = new unsigned char[arrLen];
for (int i = 0; i < arrLen; i++) 
    arr[i] = pkt[i+7];

stringstream s;
s << (char*) arr;

此外,最好在错误发生时转储pkttransferred。这样可以更轻松地分析问题。

【讨论】:

这个我也试过了,不行

以上是关于C++ 从 unsigned char* 到 stringstream:分段错误(核心转储)错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从“const char*”到“unsigned char*”的无效转换

如何从 const char* 转换为 unsigned int c++

c++ unsigned char 内存拷贝

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

C++ builder中如何把unsigned char类型转换成16进制的输出

c++中定义一个buff为unsigned char 型,如何初始化全为0