***。。/recover':free()中的错误:下一个大小无效(正常)

时间:2016-06-19 13:56:50

标签: c

这些代码不起作用! 它必须读取512字节的块直到文件结束!

  • valgrind说一切都好!
  • 分配的数据在最后释放

*错误在./recover' ;: free():无效的下一个尺寸(正常):0x09e89170 * 中止(核心倾销)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define B_SIZE 512 

char* getTitle (int c);

int main(int argc, char* argv[])
{
    // TODO

    long size;
    uint32_t *data;

    // open file

    FILE* file = fopen("card.raw", "r");

    if (!file) {
        fprintf(stderr, "Unable to open/create file\n");
        return 1;
    }

    fseek(file, 0, SEEK_END);
    size = ftell(file);
    fseek(file, 0, SEEK_SET);


    if (!(data = malloc(512))) {
        fprintf(stderr, "Failed to allocate memory\n");
        return 1;
    }

    while(true) // until end
    {
        // read 512 block
        if (ftell(file) >= size-2048)
        {
            printf("STOP\n");
            break;
        }

        fread(data, B_SIZE, 128, file);

        printf("%ld, (%li)\n", ftell(file), size);

    }

    // close all files
    free(data);
    fclose(file);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

您将B_SIZE * 128(512 * 128 = 64k)字节读入仅512字节的缓冲区。这将写出已分配内存的界限,并导致未定义的行为

如果您想一次只读取512个字节,那么请执行此操作。

fread(data, 1, B_SIZE, file);