具有malloc():已损坏的顶部大小问题
我正在尝试编写代码来测试lz4压缩的速度,而不是在终端中使用-b代码。 我正在使用ubuntu 20.04.2 LTS。和VisualStudioIDE。 这是我的代码,在main中第二次运行for循环时遇到了一些问题。具有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
这一行: 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的结果。这也不能回答问题。