Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Ошибка сегмента fclose()

Автор вопроса: ShenОтветов: 2

Почему эта простая функция вызовет ошибку seg?

int main(int argc, char** argv) {
    FILE* file1;
    file1 = fopen(argv[argc + 1], "wt");
    fclose(file1);
}
  • Почему вы переходите за конец argv[]? Dan Fego 28.02.2012
  • Потому что я хочу запустить эту программу как "./a.out file.txt". Shen 28.02.2012
  • argc - это количество элементов в argv[], поэтому argv содержит допустимые элементы от 0 до argc-1. Dan Fego 28.02.2012
  • @ShengchaoHuangfu: argv содержит именно строки argc. Параметр "file.txt" будет в argv[1] datenwolf 28.02.2012
  • О, я понял. Всем спасибо. Shen 28.02.2012

cfopenfclose

Ответы

Ответ 1 · рейтинг 3 · Jonathan Leffler

Ваш fopen() не может открыть файл, поэтому fp имеет значение NULL, поэтому fclose() законно возражает, вылетая. Проверьте возврат от fopen().

Кроме того, по определению argv[argc] == 0 и argv[argc+1] находятся за концом массива. На практике в Unix-системах это часто будет name=value первой переменной окружения, но вряд ли это действительное имя файла и уж точно оно не было получено законным путем.

Если ваша программа вызывается как:

./a.out file.txt

тогда имя файла argv[1]; строка, на которую указывает argv[0], является именем программы, a.out дает или принимает информацию о пути, а argc == 2 и argv[2] == 0. Не забудьте проверить этот argc == 2 перед попыткой открыть файл.

Всегда проверяйте статусы возврата, особенно из функции "заведомо неудачная", такой как fopen(). И напечатайте имя, которое вы открываете - оно многое рассказало бы вам о вашей проблеме - после проверки того, что argc установлено на ожидаемое вами значение.

Ответ 2 · рейтинг 2 · ckruse

Вы получаете доступ к двум элементам после последнего элемента argv. Вы также не проверяете возвращаемое значение fopen(), оба могут вызвать ошибку сегментации.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы