gpt4 book ai didi

C free() 下一个尺寸无效(正常)

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:54 28 4
gpt4 key购买 nike

我是 C 的新手,我似乎无法弄清楚什么似乎是一个非常简单的指针问题。我的程序将行号添加到文件中。它逐行读入文件,然后在每行的开头添加一个行号。它在每个文件上都可以正常工作,如下所示:

soccer@soccer-Dell-DV051:~/code C$ ./a.out test.c
soccer@soccer-Dell-DV051:~/code C$ ./a.out miscellaneousHeader.h
soccer@soccer-Dell-DV051:~/code C$ ./a.out test.c miscellaneousHeader.h
*** Error in `./a.out': free(): invalid next size (normal): 0x08648170 ***
Segmentation fault (core dumped)
soccer@soccer-Dell-DV051:~/code C$

但是当我一起运行它们时,我得到了上面的错误。以下代码是我的程序。

编译器.c:

#include <stdio.h>
#include "lineNumAdderHeader.h"
#include "miscellaneousHeader.h"

int main(int argc, char *argv[]){
if (argc < 2)
fatal("in main(). Invalid number of arguments");

int i = 1;
while (i < argc){
lineNumAdder(argv[i]);
i++;
}
}

我已将问题缩小到 lineNumPtr。当 lineNumPtr 在第二个文件之后被释放时会发生错误。如果 lineNumPtr 没有被释放,我知道这是糟糕的编程,程序运行得很好。

lineNumAdder.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "miscellaneousHeader.h"
#include "lineNumAdderHeader.h"

int lineSizeChecker(FILE*, int);
int lineNumChecker(char*);
int fileSizeChecker(FILE*);


void lineNumAdder(char* filename){
int lineSpace, position, lineNumCheckerBoolean, numOfDigits, fileSpace;
int lineNum = 1;
char *lineNumPtr = NULL;
char *numberedFile = NULL;
char *nonNumberedLine = NULL;
char *originalLine = NULL;
FILE *file = errorCheckedFopen(filename, "r+w");

while(1){
position = ftell(file);

if (position == 0){
fileSpace = fileSizeChecker(file);
numberedFile = errorCheckedMalloc(fileSpace);
}

lineSpace = lineSizeChecker(file, position);
if (position == 0)
originalLine = errorCheckedMalloc(lineSpace);
else
originalLine = realloc(originalLine, lineSpace);

if (fgets(originalLine, lineSpace, file) == NULL)
break;

lineNumCheckerBoolean = lineNumChecker(originalLine);

if (lineNumCheckerBoolean == 0){
if (position == 0)
nonNumberedLine = errorCheckedMalloc(lineSpace - 9);
else
nonNumberedLine = realloc(nonNumberedLine, lineSpace - 9);

strcpy(nonNumberedLine, &originalLine[9]);
}
else{
if (position == 0)
nonNumberedLine = errorCheckedMalloc(lineSpace);
else
nonNumberedLine = realloc(nonNumberedLine, lineSpace);

strcpy(nonNumberedLine, originalLine);

fileSpace += 8;
numberedFile = realloc(numberedFile, fileSpace);
}

numOfDigits = intDigitFinder(lineNum);
if (position == 0)
lineNumPtr = errorCheckedMalloc(numOfDigits);
else
lineNumPtr = realloc(lineNumPtr, numOfDigits);
sprintf(lineNumPtr, "%d", lineNum);

strcat(numberedFile, "/*");
strcat(numberedFile, lineNumPtr);
strcat(numberedFile, "*/");
if (lineNum < 10)
strcat(numberedFile, " ");
else if (lineNum >= 10 && lineNum < 100)
strcat(numberedFile, " ");
else if (lineNum >= 100 && lineNum < 1000)
strcat(numberedFile, " ");
else if (lineNum >= 1000 && lineNum < 10000)
strcat(numberedFile, " ");
strcat(numberedFile, nonNumberedLine);
lineNum++;
}

fclose(file);
free(originalLine);
free(nonNumberedLine);
free(lineNumPtr);
free(numberedFile);
}

int lineNumChecker(char *comment){
if (sizeOf(comment) < 8)
return 1;

if (comment[7] == '/' || comment[6] == '/' || comment[5] == '/' || comment[4] == '/')
return 0;
else
return 1;
}

int lineSizeChecker(FILE *file, int position){
int i = 2;
int ch;

while ((ch = fgetc(file)) != '\n' && ch != EOF)
i++;

fseek(file, position, SEEK_SET);

return i;
}

int fileSizeChecker(FILE *file){
int i = 2;

while (fgetc(file) != EOF)
i++;

fseek(file, 0, SEEK_SET);

return i;
}

杂项.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "miscellaneousHeader.h"

void fatal(char*);

int sizeOf(char *data){
int i = 1;

while(data[i-1] != '\n')
i++;

return i;
}

void *errorCheckedMalloc(size_t size){
void *ptr = malloc(size);

if (ptr == NULL)
fatal("in errorCheckedMalloc(). Memory Allocation Failure\n");
else
return ptr;
}

FILE *errorCheckedFopen(char *filename, char *mode){
FILE *file = fopen(filename, mode);

if (file == NULL)
fatal("in errorCheckedFopen(). File Opening Failure\n");
else
return file;
}

void fatal(char *errorMessage){
char* completedErrorMessage = errorCheckedMalloc(sizeOf(errorMessage)+17);

strcpy(completedErrorMessage, "[!!] Fatal Error ");
strcat(completedErrorMessage, errorMessage);

perror(completedErrorMessage);

free(completedErrorMessage);

exit(-1);
}

int intDigitFinder(int num){
int digits = 0;

do {
num /= 10;
digits++;
} while (num != 0);

return digits;
}

void *reMalloc(void *ptr, size_t size){
char buf[strlen(ptr) + 1];
strcpy(buf, ptr);

free(ptr);

ptr = errorCheckedMalloc(size);

if(size >= strlen(buf))
strcpy(ptr, buf);

return ptr;
}

我为长度道歉。这是我的第一篇文章,我想确保我为你们提供了足够的信息,以便给我最好的答案。感谢您的所有回答。他们很受欢迎。

最佳答案

好的,伙计们,我已经开始工作了。我调整了 lineNumAdder.c 文件。该程序现在每次读入时都会按行增加 numberedFile 的大小。第二个文件也出现错误,因为当我将 strcat 行号放入malloced 区域垃圾已经存储在那里,所以 numberedFile 会溢出。我通过使用 calloc 而不是 malloc 解决了这个问题。感谢所有给出答案和评论的人。他们都提供了巨大的帮助。

这是完成的 lineNumAdder.c 文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "miscellaneousHeader.h"
#include "lineNumAdderHeader.h"

int lineSizeChecker(FILE*, int);
int lineNumChecker(char*);
int fileSizeChecker(FILE*);


void lineNumAdder(char* filename){
int lineSpace, filePosition, lineNumCheckerBoolean, numOfDigits;
int fileSpace = 0;
int lineNum = 1;
char *lineNumPtr = NULL;
char *numberedFile = NULL;
char *nonNumberedLine = NULL;
char *originalLine = NULL;
FILE *file = errorCheckedFopen(filename, "r+w");

while(1){
filePosition = ftell(file);

lineSpace = lineSizeChecker(file, filePosition);
if (filePosition == 0)
originalLine = calloc(1, lineSpace);
else
originalLine = realloc(originalLine, lineSpace);

if (fgets(originalLine, lineSpace, file) == NULL)
break;

lineNumCheckerBoolean = lineNumChecker(originalLine);
if (lineNumCheckerBoolean == 0){
fileSpace += lineSpace;
if (filePosition == 0){
nonNumberedLine = calloc(1, lineSpace - 8);

numberedFile = calloc(1, fileSpace);
}
else{
nonNumberedLine = realloc(nonNumberedLine, lineSpace - 8);

numberedFile = realloc(numberedFile, fileSpace);
}

strcpy(nonNumberedLine, &originalLine[9]);
}
else{
fileSpace += lineSpace + 9;
if (filePosition == 0){
nonNumberedLine = calloc(1, lineSpace);

numberedFile = calloc(1, fileSpace);
}
else{
nonNumberedLine = realloc(nonNumberedLine, lineSpace);

numberedFile = realloc(numberedFile, fileSpace);
}

strcpy(nonNumberedLine, originalLine);
}

numOfDigits = intDigitFinder(lineNum);
if(filePosition == 0)
lineNumPtr = calloc(1, numOfDigits);
else
lineNumPtr = realloc(lineNumPtr, numOfDigits);
sprintf(lineNumPtr, "%d", lineNum);

strcat(numberedFile, "/*");
strcat(numberedFile, lineNumPtr);
strcat(numberedFile, "*/");
if (lineNum < 10)
strcat(numberedFile, " ");
else if (lineNum >= 10 && lineNum < 100)
strcat(numberedFile, " ");
else if (lineNum >= 100 && lineNum < 1000)
strcat(numberedFile, " ");
else if (lineNum >= 1000 && lineNum < 10000)
strcat(numberedFile, " ");
strcat(numberedFile, nonNumberedLine);
lineNum++;
}

fclose(file);
free(originalLine);
free(nonNumberedLine);
free(lineNumPtr);
free(numberedFile);
}

int lineNumChecker(char *comment){
if (sizeOf(comment) < 8)
return 1;

if (comment[7] == '/' || comment[6] == '/' || comment[5] == '/' || comment[4] == '/')
return 0;
else
return 1;
}

int lineSizeChecker(FILE *file, int position){
int i = 2;
int ch;

while ((ch = fgetc(file)) != '\n' && ch != EOF)
i++;

fseek(file, position, SEEK_SET);

return i;
}

int fileSizeChecker(FILE *file){
int i = 2;

while (fgetc(file) != EOF)
i++;

fseek(file, 0, SEEK_SET);

return i;
}

关于C free() 下一个尺寸无效(正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566277/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com