Приведение const char* к char* приводит к сбою

Когда я пытаюсь преобразовать const char* в char*, происходит сбой:

int myfunc(const char*);
const char * str = "test";
myfunc( (char*)str ) // crash

Как я могу это сделать?


person deepspace    schedule 15.04.2013    source источник
comment
Скорее всего, ваша функция изменяет строковый литерал, вызывая неопределенное поведение. Проверка строкового литерала не должна изменяться. Если вы это сделаете, все ставки сняты.   -  person Alok Save    schedule 15.04.2013
comment
Он myfunc изменяет свой аргумент?   -  person Shafik Yaghmour    schedule 15.04.2013
comment
Не бросайте. Функция все равно принимает const char*.   -  person juanchopanza    schedule 15.04.2013
comment
Проверьте это   -  person Suvarna Pattayil    schedule 15.04.2013
comment
возможный дубликат В чем разница между символ [] = строка; и char *p = строка;   -  person Alok Save    schedule 15.04.2013


Ответы (2)


Обновить

Попытка изменить строковый литерал является неопределенным поведением. Если мы посмотрим на проект стандарта C++ раздел 2.14.5 Строковые литералы параграф 12 гласит:

Являются ли все строковые литералы различными (т. е. хранятся в непересекающихся объектах), определяется реализацией. Эффект от попытки изменить строковый литерал не определен.

Сбой является одним из многих возможных результатов неопределенного поведения. Также возможно, что программа работает правильно.

В качестве альтернативы вы можете создать автоматический массив следующим образом:

char str[] = "test" ;

который будет иметь копию строкового литерала, которую вы затем сможете изменить.

Исходный

Если myfunc изменяет строковый литерал, то у вас неопределенное поведение, которое может легко привести к сбою вашей программы.

person Shafik Yaghmour    schedule 15.04.2013

То, что вы делаете, является неопределенным поведением.

Вам не разрешено изменять память, на которую указывает str. Если вам нужен тот, который вы можете изменить, объявите его следующим образом:

char str[] = "test";

Это создаст для вас изменяемую копию строкового литерала "test".

person Collin    schedule 15.04.2013