Извлечение строки из аргументов main () - PullRequest
5 голосов
/ 06 апреля 2011

Я пытаюсь создать указатель на один из аргументов main () в моей программе. Я установил начальный указатель, затем я установил его равным 2-му элементу в массиве, но я получаю ошибку, когда пытаюсь скомпилировать, ошибка сегментации. Это происходит потому, что указатель указывает на неправильный адрес?

Вот код:

char *filename;
*filename = argv[1];
printf("The filename is: %s", *filename);

Я получаю ошибки об указателе, пытающемся привести аргумент к типу int. Это потому, что указатель на самом деле является целочисленным адресным значением, и я пытаюсь установить его равным строке?

Редактировать: Когда я изменяю на «filename = argv [1]», то я получаю следующую ошибку от моего компилятора: назначение отбрасывает квалификаторы из целевого типа указателя.

Ответы [ 4 ]

7 голосов
/ 06 апреля 2011

Ошибка сегментации не может возникнуть при компиляции. Если, конечно, компилятор нарушает безопасность памяти, что маловероятно. Я так понимаю, что это происходит при запуске программы: D.

Проблема здесь:

*filename = argv[1];

Должно быть:

filename = argv[1];

Почему? Вы объявили указатель на char, унифицированное, в частности, нигде. Затем вы разыменовываете этот указатель и присваиваете данные этой позиции в памяти. Что, ну кто знает где!

Редактировать: вы также разыменовываете filename в вызове printf(). Удалить это *:).

Кроме того, не 'компилятор выдает предупреждение, когда вы назначаете * имя файла? Можно ли предположить, что создание целого числа из указателя без приведения? Обратите внимание на предупреждения , они предоставляют полезную информацию!

Приветствие.

4 голосов
/ 06 апреля 2011

Вы не заставляете filename указывать на то же место, что и argv[1].Для этого вам нужно

filename = argv[1];

В вашей версии (*filename = argv[1];) вы пытаетесь указать любому имени файла точки, имеющие значение в argv [1].В этом много чего плохого: а) имя файла не инициализировано и может указывать куда угодно, даже на недопустимые места;б) argv[1] имеет тип char*, и вы пытаетесь поместить его в местоположение типа char!

3 голосов
/ 06 апреля 2011

В операторе *filename = argv[1]; выражение *filename пытается разыменовать (найти значение, на которое указывает) указатель filename, который еще нигде не имеет смысла.

Изменить присвоение на filename = argv[1].

0 голосов
/ 06 апреля 2011

Вы разыменовываете char *, когда пытаетесь назначить его, поэтому вы пытаетесь вставить указатель в char. И поскольку имя файла неинициализировано, вы пытаетесь указать какой-то случайный адрес (или, возможно, адрес 0x00000000). И ваше утверждение print, если вы зашли так далеко, тоже не сработает: вы снова разыменовываете символ char * (чтобы получить char), а затем говорит printf интерпретировать это как указатель на строку с нулевым символом в конце.

Попробуйте это:

char *filename ;
filename = argv[1] ;
printf( "The filename is: %s" , filename ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...