我有一个很大的char*
对象。当我将此数组写入文件时,此文件的大小为63.7 MB。我从这个对象收到QByteArray
对象,如此
QByteArray outputDataByteArray(outputData, outputSize);
如果我尝试将此对象作为QString
参数发送,我会收到
传递给C运行时函数的参数无效。
在调试时我注意到在使用此数组作为输入参数调用函数后它崩溃了,但是没有进入此函数。
我试过这样的事情
outputDataByteArray.append("\0");
根据文件信息,
警告:使用
fromRawData()
创建的字节数组不以空值终止,除非原始数据在位置大小中包含0个字符。虽然这对QDataStream
或indexOf()
等函数无关紧要,但将字节数组传递给接受const char *
预期为'\0'
的函数 - 终止将失败。
但它对我没有帮助。
对于小尺寸的数据,一切正常。
版:
这是我在其中收到QBytearray
的一些功能(一切正常):
uncompress(const QByteArray &inputByteArray, bool *ok)
{
if (ok != NULL)
*ok = false;
const char *inputData = inputByteArray.data();
char *outputData = NULL;
qint64 outputSize = 0;
for (int i = 0; i < CHUNK_COUNT_MAX; i++)
{
const int outputSizeMax = CHUNKSIZE * (i + 1);
outputData = new char[outputSizeMax];
outputSize = LZ4_decompress_safe_withPrefix64k(inputData, outputData, inputByteArray.length(), outputSizeMax);
if (outputSize < 0)
{
delete [] outputData;
outputData = NULL;
}
else
{
break;
}
}
if (outputData == NULL)
return QByteArray();
QFile file("C:/Users/HOME/file.txt");
if(file.open(QIODevice::WriteOnly))
{
file.write(outputData, outputSize);
}
file.close();
QByteArray outputDataByteArray(outputData, outputSize);
outputDataByteArray.append("\0");
delete [] outputData;
if (ok != NULL)
*ok = true;
return outputDataByteArray;
}
但是,如果我尝试使用此数组作为参数调用另一个函数:
parse(outputDataByteArray, ok);
我收到了上面写的内容。
增加: 它没有出现在这个函数中,而是我发送QByteArray作为参数的函数的定义:
parse(const QString &json, bool &success)
{
success = true;
if(!json.isNull() || !json.isEmpty())
{
QString data = json;
int index = 0;
QVariant value = Json::parseValue(data, index, success);
return value;
}
else
{
return QVariant();
}
}
答案 0 :(得分:0)
您正在呼叫LZ4_decompress_safe_withPrefix64k
:
char *outputData = NULL;
而且,这个函数的定义是这样的:
int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize)
{
return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB);
}
而且,LZ4_decompress_generic
的定义没有任何输出缓冲区的分配代码。请参阅LZ4_decompress_generic
的{{3}}。
它只是在line # 1129
中进行了类型转换:
BYTE* op = (BYTE*) dest;
并且,在整个该功能的定义中进一步使用它,例如memcpy
,LZ4_wildCopy
,LZ4_copy8
等
因此,它是输出缓冲区指针指向的无效内存。您需要在将内存传递给函数之前分配它的内存。除此之外,您还需要在将指针传递给其他函数之前对其进行验证。您可以使用asserts
或if
检查来验证这一点。
希望这会有所帮助。