Я отлаживал это из-за этого и не могу понять, почему мои фэги не работают. Прежде чем я изменил свой код таким образом, чтобы он динамически менял размеры массивов, fgets работает отлично. Поскольку я новичок в C, эта проблема сбила меня с толку довольно долго.Ошибка сегментации от fgets
Вот дефектный код:
int readNumbers(int **array, char* fname, int hexFlag) {
int numberRead = 0;
FILE* fp;
int counter = 0;
char arr[100];
char* ptr;
size_t curSize = 16;
int radix = hexFlag ? 16 : 10;
*array = malloc(0 * sizeof(*array));
fp = fopen(fname, "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
while (fgets(arr, sizeof(arr), fp)) { //Seg faults here when it reaches end of file.
ptr = strtok(arr, " \n");
while(ptr) {
if (counter >= curSize) {
curSize += 16;
array = realloc(*array, curSize * sizeof(**array));
}
(*array)[counter++] = strtol(ptr, NULL, radix);
++numberRead;
ptr = strtok(NULL , " \n");
}
}
if (ferror(fp)) {
fclose(fp);
return -1;
}
Вот рабочий код, прежде чем изменения, чтобы сделать изменение размера массива:
int readNumbers(int array[], char* fname, int hexFlag) {
int numberRead = 0;
FILE* fp;
int counter = 0;
char arr[100];
char* ptr;
fp = fopen(fname, "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
while (fgets(arr, sizeof(arr), fp)) {
ptr = strtok(arr, " \n");
while(ptr) {
if (hexFlag == 0) {
array[counter++] = strtol(ptr , NULL , 10);
} else {
array[counter++] = strtol(ptr, NULL, 16);
}
++numberRead;
ptr = strtok(NULL , " \n");
}
}
if (ferror(fp)) {
fclose(fp);
return -1;
}
только что добавленных Изменения SEG неисправности, когда конец файла достиг. Я сильно подозреваю, что это связано с двойными указателями. Любая помощь очень ценится!
подумал ли он будет работать ..? '* array = malloc (0 * sizeof (* array));' –
@AmitSharma Ah! Я вижу, это исправлено! Но я не понимаю, как это может привести к тому, что fgets будет отключен только в конце файла, а не сразу. – Ansdai