Причиной ошибки сегментации является выражение p_file = NULL
, используемое в качестве условия.
p_file = NULL
- это выражение присваивания .Он устанавливает p_file
в NULL
и оценивается как присвоенное значение, равное NULL
.NULL
трактуется как ложное при использовании в качестве условия.
С другой стороны, условие, являющееся ложным, указывает на успешное открытие файла, когда условие сравнение p_file == NULL
.
В этом случае условие становится ложным, когда p_file
не является NULL
.
По этой причине в выражении else
записывается код, который ожидает, что p_file
не является NULL
..
Код включает в себя операторы, которые передают p_file
в fgetc()
.
В результате NULL
передается в fgetc()
, и это является одной из возможных причин ошибки сегментации.
Обратите внимание, что ваш код по-прежнему кажется неправильным после устранения этой ошибки сегментации.
В данном примере размерная часть равна 10 8
, что составляет 4 символа.Это означает, что пропуск «3 символов» не имеет смысла.
Также обратите внимание, что запуск i
с 3 не пропустит содержимое файла и просто оставит первые 3 элемента массива неинициализированными, как указывают некоторые программисты.
Вместо этого вы можете «пропустить первую строку».Другими словами, вы можете «пропустить до первого символа новой строки».
size_t size=1;
int c;
while (getc(p_file)!=EOF) {
size++;
}
fseek(p_file,0,SEEK_SET);
while ((c=getc(p_file))!='\n' && c!=EOF) { // drop the first line
size--;
}
p_array=(char*)malloc(sizeof(char)*size);
if (p_array!=NULL) { // for in case malloc() fails
for(size_t i=0; i<size-1; i++) {
p_array[i]=(char)getc(p_file);
}
p_array[size-1]='\0';
}
fclose(p_file);
Одним из способов включения индексирования width*i+j
является удаление символов новой строки, добавив этот код после строки p_array[i]=(char)getc(p_file);
:
if (p_array[i] == '\n') { // if the character is newline, remove it
i--; // rollback
size--; // adjust size for the newline character dropped
}