使用memcpy和malloc导致数据流损坏

时间:2012-06-07 15:19:32

标签: objective-c ios c

下面的代码尝试使用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;
        }
    }       

2 个答案:

答案 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。