问题描述
我正在尝试创建一个程序来计算两个文件之间的编辑距离。我阅读了函数功能,并使用代码读取了二进制文件(“ rb”)。我输入了两个PDF文件,并在调试过程中发现,当我尝试填充Levenshtein距离算法的矩阵时,第一个文件的字符编号1354处出现“ SIGSEGV(分段错误)”,程序退出与:
我控制并且1354字符为\ n。
long getFileSize(FILE *file) {
long int size;
fseek(file,SEEK_END);
size = ftell(file);
fseek(file,SEEK_SET);
return size;
}
char *readFromBinary(char *path) {
FILE *file;
file = fopen(path,"rb");
if (file == NULL)
printf("Error!\n");
long fileSize = getFileSize(file);
char *buffer = malloc((fileSize + 1) * sizeof(char));
fread(buffer,sizeof(char),fileSize,file);
return buffer;
}
这是我用来计算编辑距离的代码:
int calculatedistance(char *pathFile1,char *pathFile2,int choice,char *path) {
FILE *f1 = fopen(pathFile1,"rb");
FILE *f2 = fopen(pathFile2,"rb");
char *contentFile1 = readFromBinary(pathFile1);
char *contentFile2 = readFromBinary(pathFile2);
int distance = 0;
int dim1 = getFileSize(f1);
int dim2 = getFileSize(f2);
int **matrix = constructMatrix(dim1,dim2);
fillMatrix(matrix,dim1,dim2,contentFile1,contentFile2);
distance = matrix[dim1][dim2];
struct Instruction instruction[distance + 1];
int initactions = initInstructions(matrix,pathFile1,&dim1,pathFile2,&dim2,instruction);
endInstructions(pathFile1,instruction,initactions);
if (choice == 1)
printOnFile(instruction,distance,path);
for (int i = 0; i <= dim1; i++)
free(matrix[i]);
free(matrix);
if (numberOfDivisions > 0)
numberOfDivisions--;
return distance;
}
这是我用来创建和填充矩阵的代码:
int **constructMatrix(int dim1,int dim2) {
//matrice di puntatori
int **matrice = (int **) malloc((dim1 + 1) * sizeof(int *));
//matrice di puntatori
for (int i = 0; i <= dim1; i++)
matrice[i] = (int *) malloc((dim2 + 1) * sizeof(int));
return matrice;
}
void fillMatrix(int **matrix,int dim1,int dim2,char *file1,char *file2) {
for (int i = 0; i <= dim1; i++)
matrix[i][0] = i;
for (int j = 1; j <= dim2; j++)
matrix[0][j] = j;
for (int i = 1; i <= dim1; i++) {
for (int j = 1; j <= dim2; j++) {
if (file1[i - 1] != file2[j - 1]) {
int k = minimum(matrix[i][j - 1],matrix[i - 1][j],matrix[i - 1][j - 1]);
matrix[i][j] = k + 1;
} else
matrix[i][j] = matrix[i - 1][j - 1];
}
}
}
特别是,当i = 1354时,调试器将停止在此行calculatedistance(fillMatrix(matrix,contentFile2);
)和此行fillMatrix(matrix[i][0] = i;
)中。
有关PDF的信息:
PDF文件为188671字节
它有1355行
PS。我的程序可以处理txt文件。
解决方法
您至少要分配188671 * 1355 * 4字节= 1022596820字节。您确实需要检查malloc的返回值,以确保它能够成功分配。
,当包括malloc,calloc和realloc()在内的任何内存分配功能向OS请求获取内存时,除非OS可以找到{ {3}}个请求大小的内存,该函数将返回NULL
。由于您要求的块大小令人难以置信,因此它很可能会失败。
始终建议在尝试使用返回的值之前测试以下任何函数的返回值:
char *buffer = malloc((fileSize + 1) * sizeof(char));
if(!buffer)
{
//handle error
在这种情况下,最好重新评估算法。