Ошибка сегмента 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)


Ваш 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

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

person ckruse    schedule 28.02.2012