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

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

int main(int argc, char** argv) {
    FILE* file1;
    file1 = fopen(argv[argc + 1], "wt");
    fclose(file1);
}

person Shen    schedule 28.02.2012    source источник
comment
Почему вы переходите за конец argv[]?   -  person Dan Fego    schedule 28.02.2012
comment
Потому что я хочу запустить эту программу как «./a.out file.txt».   -  person Shen    schedule 28.02.2012
comment
argc — это количество элементов в argv[], поэтому argv содержит допустимые элементы от 0 до argc-1.   -  person Dan Fego    schedule 28.02.2012
comment
@ShengchaoHuangfu: argv содержит именно строки argc. Параметр «file.txt» будет в argv[1]   -  person datenwolf    schedule 28.02.2012
comment
О, я понял. Всем спасибо.   -  person Shen    schedule 28.02.2012


Ответы (2)


arrow_upward
3
arrow_downward

Ваш 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 установлено на ожидаемое вами значение.

person Jonathan Leffler    schedule 28.02.2012

arrow_upward
2
arrow_downward

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

person ckruse    schedule 28.02.2012