Я новичок в C из java и немного беспокоюсь по управлению памятью. У меня есть эта функция, целью которой является чтение x через y строк файла. Я пытаюсь написать функцию так, чтобы она могла обрабатывать любую строку размера в файле. Вот функция:Получение прерывания ловушки 6 после вызова malloc()
char** getRangeOfLinesFromFile(char* fileName, int startingLineNumber, int endingLineNumber, int BUFFER_SIZE) {
//set up an array to hold the range of lines we're going to return
//+1 because the range is inclusive
char** lineArray = malloc((endingLineNumber - startingLineNumber + 1) * sizeof(char*));
//get the file
FILE* file_ptr = fopen(fileName,"r");
//our buffer array will hold the lines as we read them
char *buffer = (char*) malloc(sizeof(char) * BUFFER_SIZE);
//this array will be used just in case a line is bigger than our buffer and we need to take multiple passes at it
char *temp = (char*) malloc(sizeof(char) * BUFFER_SIZE);
int lineCounter = 1;
while (fgets(buffer, BUFFER_SIZE, file_ptr) != NULL) {
strcat(temp, buffer);
size_t len = strlen(temp);
if (temp[len - 1] != '\n') {
realloc(temp,BUFFER_SIZE);
} else {
if (shouldKeepLine(lineCounter,startingLineNumber,endingLineNumber)) {
int index = lineCounter - startingLineNumber;
lineArray[index] = malloc(len * sizeof(char));
//ERROR HERE
strcpy(lineArray[index],temp);
}
*temp = *(char*) malloc(sizeof(char) * BUFFER_SIZE);
lineCounter++;
// we don't need to keep reading the file if we're not going to print anything else
if (lineCounter > endingLineNumber) {
break;
}
}
}
//clean up
free(buffer);
free(temp);
fclose(file_ptr);
return lineArray;
}
Это то, что shouldKeepLine() функция выглядит следующим образом:
bool shouldKeepLine(int lineNumber, int lowerBound, int upperBound) {
if (lineNumber >= lowerBound && lineNumber <= upperBound) {
return true;
}
return false;
}
Во время тестирования я использую размер буфера 10, так что я могу проверить, что это растет ' должным образом. Этот размер увеличится, когда программа будет завершена. В тестовом файле, который я использую для чтения, в настоящее время есть 2 строки. Первая строка файла имеет 15 символов. Во второй строке около 90 или около того.
Когда я запускаю эту программу, я получаю ошибку Abort trap 6. После ввода некоторых отладочных операторов печати я вижу, что он выдает эту ошибку при вызове strcpy прямо под комментарием ERROR HERE в моем коде, но только для строки 2, а не для строки 1. Строка 1 также больше, чем буфер, но десятая или так что размер линии 2. Если изменить эту строку:
lineArray[index] = malloc(len * sizeof(char));
к:
lineArray[index] = malloc(len * sizeof(char) * 1000);
Он работает отлично. Это просто не кажется динамичным.
Не уверен, что я делаю неправильно. Любая помощь приветствуется.
Одной из потенциальных проблем является инструкция 'realloc (temp, BUFFER_SIZE);'. 'realloc' вернет новый указатель, и старое значение' temp' больше не будет считаться действительным. Простое исправление было бы присвоить возвращаемое значение 'realloc'' temp'. –
Кроме того, строка '* temp = * (char *) malloc (sizeof (char) * BUFFER_SIZE);' будет захватывать случайное значение символа из неинициализированной памяти. –
Drew, я изменил строку 'realloc' на' temp = realloc ... 'и это не исправило проблему :( Как мне решить проблему, возникшую во втором комментарии? – A2345sooted