Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > SEGFAULT при обращении по указателю на строку


Автор: LeonidPr 11.5.2014, 19:06
Сегодня столкнулся со странной проблемой. Свел её к минимальному неработающему варианту.
Вот такой код при выполнении дает Segmentation fault
Код

void test(char *s) {
    *s=' ';
};
     
char *test_str="it's a test string";
     
int main() {
    test(test_str);
}

gcc 4.5.2 из сборки MinGW
После того как подумал переделал так
Код

void test(char *s) {
    *s=' ';
};
     
char test_str[]="it's a test string";
     
int main() {
    test(test_str);
}

Этот вариант собирается и исполняется без проблем.
Но хотелось бы понять, почему первый вариант не работает?
А вот еще, попробовал собрать и запустить первый вариант в C++ Builder 5 - все выполнилось без проблем.
Мои измышления - в первом варианте выделяется память под строку (временный объект, неименованный), затем адрес этой области присваивается указателю test_str, но на момент вызова функции test, эта область уже оказывается освобождена (почему?) и возникает ошибка. Объяснение фантастическое, но я пока ума не приложу, что может быть еще?

Автор: leniviy 11.5.2014, 19:29
я думаю, он поместил строку в ридонли секцию.
http://stackoverflow.com/questions/164194/why-do-i-get-a-segmentation-fault-when-writing-to-a-string

С ключом -Wwrite-strings gcc пишет:
Код

aaa.c:5:16: warning: initialization discards 'const' qualifier from pointer target type [enabled by default]
 char *test_str="it's a test string";
                ^

Автор: LeonidPr 11.5.2014, 20:17
Спасибо за ссылку!
Варнинг видел, но не думал что компилятор в секцию .text положит строку, но сейчас Map файл посмотрел, да, действительно туда заносит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)