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++ 代码并尝试使用 stringstream
将 unsigned 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);
这是一个更详细的代码。 fill
是 libusb_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”吗? 你有没有初始化过arr
? fill
是做什么的?
我们是否可以假设在某个时候,您实际上为arr
分配了内存以指向(例如arr = new unsigned char[<something>]
)?否则,它可能指向任何东西或什么都没有并调用未定义的行为......同样,如果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;
此外,最好在错误发生时转储pkt
和transferred
。这样可以更轻松地分析问题。
【讨论】:
这个我也试过了,不行以上是关于C++ 从 unsigned char* 到 stringstream:分段错误(核心转储)错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
从“const char*”到“unsigned char*”的无效转换
如何从 const char* 转换为 unsigned int c++
在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short