fclose () ошибка сегмента - PullRequest
       34

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

0 голосов
/ 28 февраля 2012

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

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

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Ваш 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 голосов
/ 28 февраля 2012

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

...