Почему эта простая функция вызовет ошибку seg?
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
Почему эта простая функция вызовет ошибку seg?
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
Ваш 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
установлено на ожидаемое вами значение.
Вы получаете доступ к двум элементам после последнего элемента argv
. Вы также не проверяете возвращаемое значение fopen()
, оба могут вызвать ошибку сегментации.
argv[]
? - person Dan Fego   schedule 28.02.2012argc
— это количество элементов вargv[]
, поэтомуargv
содержит допустимые элементы от0
доargc-1
. - person Dan Fego   schedule 28.02.2012argv[1]
- person datenwolf   schedule 28.02.2012