具有malloc():已损坏的顶部大小问题

具有malloc():已损坏的顶部大小问题,c,linux,visual-studio,lz4,C,Linux,Visual Studio,Lz4,我正在尝试编写代码来测试lz4压缩的速度,而不是在终端中使用-b代码。 我正在使用ubuntu 20.04.2 LTS。和VisualStudioIDE。 这是我的代码,在main中第二次运行for循环时遇到了一些问题。 这一行: fread(src,16384,1,fc) 当i=1时,它会按照我的预期工作。但是,当i=2时,就会出现malloc()问题 //分割文件功能可以完美地工作 #include <stdio.h> #include <stdlib.h> #inc

我正在尝试编写代码来测试lz4压缩的速度,而不是在终端中使用-b代码。 我正在使用ubuntu 20.04.2 LTS。和VisualStudioIDE。 这是我的代码,在main中第二次运行for循环时遇到了一些问题。
这一行: fread(src,16384,1,fc)

当i=1时,它会按照我的预期工作。但是,当i=2时,就会出现malloc()问题

//分割文件功能可以完美地工作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "lz4.h"
int splitFile(char* fileIn, size_t maxSize);
#include "lz4.c"


int main()
{
    time_t start,end;
    int compress, decompress;
    int64_t num_f=0;
    int64_t i;



    char* src=malloc(16384);
    int srcSize= 16385;//(int)(strlen(src) + 1);
    int dstCapacity=0; 
    int compressed_data_size=0;
    
    char* compressed_data = malloc((size_t)dstCapacity);
    char buff[200];

    FILE * fc;

    num_f = splitFile("/home/ziruo/research/1stpro/test.txt",16384);
    printf("num_f=%ld\n",num_f);

    start = time(NULL);
    for( i = 1; i <= num_f; i++)
    {
        sprintf(buff,"/home/ziruo/research/1stpro/test.txt.%03d",i);
        printf("buff %s\n",&buff);
        if (compressed_data == NULL)
        {
            printf("faild to generae storage\n");
        }
        fc = fopen(buff,"r");
        printf("fc is: %d\n",fc);

        fread(src,16384,1,fc);
        srcSize=(int)(strlen(src) + 1);
        dstCapacity= LZ4_compressBound(srcSize)
        compressed_data_size = LZ4_compress_default(src,compressed_data,srcSize,dstCapacity);
        LZ4_compress_default(src,compressed_data,srcSize,dstCapacity);
        printf("data size ratio %.2f\n", (float)compressed_data_size/srcSize);
        
    }

    end = time(NULL);

    printf("time used(s): %f\n",difftime(end,start));


    return 0;

}




int splitFile(char* fileIn, size_t maxSize)
{
    int result = 0;
    FILE* fIn;
    FILE* fOut;
    char buffer[1024 * 16];
    size_t size;
    size_t read;
    size_t written;


    if ((fileIn != NULL) && (maxSize > 0))
    {
        fIn = fopen(fileIn, "rb");
        if (fIn != NULL)
        {
            fOut = NULL;
            result = 1;   // we have at least one part

            while (!feof(fIn))
            {
                // initialize (next) output file if no output file opened
                if (fOut == NULL)
                {
                    sprintf(buffer, "%s.%03d", fileIn, result);
                    fOut = fopen(buffer, "wb");
                    if (fOut == NULL)
                    {
                        result = -1;
                        break;
                    }

                    size = 0;
                }

                // calculate size of data to be read from input file in order to not exceed maxSize
                read = sizeof(buffer);
                if ((size + read) > maxSize)
                {
                    read = maxSize - size;
                }

                // read data from input file
                read = fread(buffer, 1, read, fIn);
                if (read == 0)
                {
                    result = -1;
                    break;
                }

                // write data to output file
                written = fwrite(buffer, 1, read, fOut);
                if (written != read)
                {
                    result = -1;
                    break;
                }

                // update size counter of current output file
                size += written;
                if (size >= maxSize)   // next split?
                {
                    fclose(fOut);
                    fOut = NULL;
                    result++;
                }
            }

            // clean up
            if (fOut != NULL)
            {
                fclose(fOut);
            }
            fclose(fIn);
        }
    }

    return (result);
}
#包括
#包括
#包括
#包括
#包括“lz4.h”
int splitFile(char*fileIn,size\u t maxSize);
#包括“lz4.c”
int main()
{
开始、结束的时间;
int压缩、解压缩;
int64_t num_f=0;
int64_t i;
char*src=malloc(16384);
int srcSize=16385;/(int)(strlen(src)+1);
int DST容量=0;
int压缩数据大小=0;
char*compressed_data=malloc((size_t)数据容量);
字符buff[200];
文件*fc;
num_f=splitFile(“/home/ziruo/research/1stpro/test.txt”,16384);
printf(“num\u f=%ld\n”,num\u f);
开始=时间(空);
对于(i=1;i=0))
{
fIn=fopen(文件输入,“rb”);
如果(fIn!=NULL)
{
fOut=NULL;
result=1;//我们至少有一个部分
而(!feof(fIn))
{
//如果没有打开输出文件,则初始化(下一个)输出文件
如果(fOut==NULL)
{
sprintf(缓冲区,“%s.%03d”,文件输入,结果);
fOut=fopen(缓冲区,“wb”);
如果(fOut==NULL)
{
结果=-1;
打破
}
尺寸=0;
}
//计算要从输入文件读取的数据的大小,以便不超过maxSize
read=sizeof(缓冲区);
如果((大小+读取)>最大大小)
{
读取=最大大小-大小;
}
//从输入文件读取数据
read=fread(缓冲区,1,read,fIn);
如果(读==0)
{
结果=-1;
打破
}
//将数据写入输出文件
write=fwrite(缓冲区,1,读取,fOut);
如果(已写!=已读)
{
结果=-1;
打破
}
//更新当前输出文件的大小计数器
大小+=已写入;
如果(大小>=maxSize)//下一次拆分?
{
fclose(fOut);
fOut=NULL;
结果++;
}
}
//清理
如果(fOut!=NULL)
{
fclose(fOut);
}
财务总监(财务);
}
}
返回(结果);
}
这是错误的图片

使用
malloc时,最好强制转换分配给特定类型的内存。
对于
char*
您可以执行以下操作:

char *string;
...
string = (char *)malloc(sizeof(dstCapacity) + sizeof(char));

+sizeof(char)
为终止C中每个字符串的NULL提供了空间。

int-dstCapacity=0;char*compressed_data=malloc((size_t)数据容量)分配大小为0的内存块。也许您想在分配之前计算所需的目的地大小?请学习如何创建一个用于向我们展示的,重点是最小部分。最小化程序有助于调试,并使查找问题根源变得更容易。
char*src=malloc(16384);int srcSize=16385这些数字中的一个与另一个不同。@Retired Ninja我试图给它一个大小,然后用LZ4_compressBound函数计算它的大小。@n。1.8e9-where's-my-share m。我认为srcSize是基于int(strlen(src)+1);在C语言中,最好不要强制转换malloc的结果。这也不能回答问题。