2016-02-09 3 views
-1

Я пишу программу на языке C, которая ищет строку внутри файла. Когда я компилирую и запускаю программу из командной строки, я получаю ошибку ошибки сегментации. Я знаю, что эта ошибка означает, что у меня нет доступа к памяти, которую я пытаюсь записать, но я не вижу, как это происходит в моей программе. Вот сегмент кода в моей main функции, где происходит ошибка:Я не понимаю, почему я получаю сообщение «Ошибка сегментации (core dumped)»

int num_of_arguments = argc; 
char *filename = argv[2]; 
char *search_string; 

strcpy(search_string, argv[1]); 

int i = 0; 
while (search_string[i]) { 
    tolower(search_string[i]); 
    i++; 
} 
+1

Ваш 'search_string' является неинициализированным указатель, указывающий в никуда , И вы пытаетесь «strcpy», что 'argv [1]' никуда. Отсюда крушение. – AnT

+0

use '' search_string = strdup (argv [1]) '' вместо strcpy – Vorsprung

ответ

4

В коде

strcpy(search_string, argv[1]); 

вызывает undefined behavior, как вы пытаетесь писать в инициализированы памяти, указываемый search_string , Поскольку вы не инициализировали явно search_string, указатель (значение указателя) является неопределенным и, скорее всего, указывает на некоторую ячейку памяти, недоступную из вашей программы. Таким образом, указатель по существу указывает на недействительный расположение памяти.

Вы должны выделить память search_string, прежде чем сможете копия в нее.

В противном случае сделайте search_string массив достаточной длины, который может содержать содержимое argv[1] (включая нуль-терминатор) перед выполнением strcpy().

+0

Спасибо, теперь это имеет смысл, я думаю об этом. Как указано в других ответах, 'strdup()' является лучшим решением моей проблемы. – KOB

+0

@CornOnTheKob хорошо, я не против использования 'strdup()', но просто примечание, это не стандарт C. –

0

Вы используете search_string без инициализации, вместо:

strcpy(search_string, argv[1]); 

Вы должны использовать:

search_string=strdup(argv[1]); 

Посмотрите: strcpy vs strdup

+0

Я даже не знал, что 'strdup' существует. Я использую это isntead, и все работает нормально, спасибо. – KOB