下面的代码尝试使用fwrite将数据流保存到文件中。使用malloc的第一个示例有效但第二个示例的数据流被%70损坏。有人可以向我解释为什么第二个例子已损坏以及我如何解决它?
short int fwBuffer[1000000];
// short int *fwBuffer[1000000];
unsigned long fwSize[1000000];
// Not Working *********
if (dataFlow) {
size = sizeof(short int)*length*inchannels;
short int tmpbuffer[length*inchannels];
int count = 0;
for (count = 0; count < length*inchannels; count++)
{
tmpbuffer[count] = (short int) (inbuffer[count]);
}
memcpy(&fwBuffer[saveBufferCount], tmpbuffer, sizeof(tmpbuffer));
fwSize[saveBufferCount] = size;
saveBufferCount++;
totalSize += size;
}
// Working ***********
if (dataFlow) {
size = sizeof(short int)*length*inchannels;
short int *tmpbuffer = (short int*)malloc(size);
int count = 0;
for (count = 0; count < length*inchannels; count++)
{
tmpbuffer[count] = (short int) (inbuffer[count]);
}
fwBuffer[saveBufferCount] = tmpbuffer;
fwSize[saveBufferCount] = size;
saveBufferCount++;
totalSize += size;
}
// Write to file ***********
for (int i = 0; i < saveBufferCount; i++) {
if (isRecording && outFile != NULL) {
// fwrite(fwBuffer[i], 1, fwSize[i],outFile);
fwrite(&fwBuffer[i], 1, fwSize[i],outFile);
if (fwBuffer[i] != NULL) {
// free(fwBuffer[i]);
}
fwBuffer[i] = NULL;
}
}
答案 0 :(得分:1)
这有很大的崩溃机会
short int tmpbuffer[(short int)(size)];
第一个尺寸可能太大了,但是然后将它截断并且具有任何尺寸的结果可能不是你想要的。
编辑:尝试编写整个代码而无需单独演员。只有这样编译器才有机会告诉你是否有错误。
答案 1 :(得分:1)
您将size
初始化为
size = sizeof(short int) * length * inchannels;
然后你声明一个大小为
的数组short int tmpbuffer[size];
这已经非常可疑了。为什么在大小中包含sizeof(short int)
,然后声明具有该大小的short int
元素数组?在这种情况下,数组的字节大小为
sizeof(short int) * sizeof(short int) * length * inchannels
即。 sizeof(short int)
被考虑了两次。
稍后,由于上述原因,您只初始化数组的length * inchannels
个元素,而不是整个数组。但是后面的memcpy
仍会复制整个数组
memcpy(&fwBuffer[saveBufferCount], &tmpbuffer, sizeof (tmpbuffer));
(复制数据的尾部是垃圾)。我怀疑你复制sizeof(short int)
次数据的次数超过预期。收件人内存溢出并被破坏。
基于malloc
的版本不会遇到此问题,因为malloc
- 内存大小以字节为单位指定,而不是short int
- s。
如果您想在代码的较高版本中模拟malloc
行为,则需要将tmpbuffer
声明为char
元素的数组,而不是short int
元素} elements。