重新分配错误:释放对象的校验和不正确

| 我尝试编写从stdin读取数据的代码:
size_t bufSize = 1024;
unsigned char *msg = NULL;
size_t msgBytes = 0;
size_t inputMsgBufCount = 0;
unsigned char inputBuffer[bufSize];
size_t bytesRead = 0;
unsigned char *tmp = NULL;

if ((msg = (unsigned char *)malloc(sizeof(unsigned char) * bufSize)) == NULL)
    exit(EXIT_FAILURE);
bytesRead = fread(msg, sizeof(unsigned char) * bufSize, 1, stdin);
inputMsgBufCount++;

while (bytesRead) {
    printf(\"iteration: %lu\\n\", inputMsgBufCount);
    if ( (tmp = (unsigned char *)realloc(msg, (inputMsgBufCount * bufSize) + bufSize)) != NULL ) {
         printf(\"reallocated\\n\");
        msg = tmp;
        inputMsgBufCount++;
    }
    else {
        printf(\"Ran out of memory\\n\");
        free(msg);
    }
    bytesRead = fread(inputBuffer, sizeof(unsigned char) * bufSize, 1, stdin);
    memmove((msg + (inputMsgBufCount * bufSize)), inputBuffer, bufSize);
}

free(msg);

msgBytes = (inputMsgBufCount * bufSize);

gettimeofday(&end, NULL);
printf(\"%10.6lf [MB/s]\\n\", (msgBytes / (1<<20)) / ( (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) * 1.0e-6f ));
但是运行后如下所示: 〜#dd if = / dev / zero bs = 1024 count = 8 | 。/测试 我有这个错误: 迭代次数:1 重新分配 迭代次数:2 重新分配 迭代:3 重新分配 迭代:4 重新分配 迭代次数:5 重新分配 迭代:6 重新分配 迭代:7 test(11450)malloc:***对象0x100804008的错误:已释放对象的校验和不正确-对象在释放后可能已被修改。 ***在malloc_error_break中设置断点以进行调试 中止陷阱 谁能帮我。     
已邀请:
在将数据复制到味精缓冲区中后,应该将“ 1”增加。您在初读时就做对了,但是对于其他所有事情,都可以在重新分配后立即增加它。如果遵循其值,则在进入循环时为1。您重新分配给
2*bufSize
,并递增
inputMsgBufCount
,使其变为2。然后读取数据,并将其复制到
msg+2*bufSize
。这正在破坏您的缓冲区。您应该已经复制到
msg+bufSize
。只需延迟递增变量,直到复制数据之后。 另外,您可以放心地使用ѭ6copy复制数据。
msg
inputBuffer
将不会重叠。实际上,您可能应该完全摆脱
inputBuffer
,并以正确的偏移量直接读取
msg
。     

要回复问题请先登录注册