2015-07-09 4 views
2

Почему код ниже дает мне ошибку сегментации.Назначение значения массиву char в C++

int main() 
{ 
    char *something = "hello\n"; 
    something[2] = 'a'; // doesn't work 
    *(something+2) = 'a'; // this doesn't work either 
    return 0; 
} 

Но следующий код работает нормально.

int main() 
{ 
    char something[] = "hello\n"; 
    something[2] = 'a'; //works fine 
    *(something+2) = 'a'; //works fine 
    return 0; 
} 

«Что-то» переменная является массив символов в обоих так почему я не могу присвоить литеру на третий элемент массива в первом примере?

+2

'char * something =" hello \ n ";' устарел на C++. Фактический тип - 'const char *', который является неизменным (относительно одиночных символов). –

+0

Вы не получили предупреждение об этом коде? – Borgleader

+0

* «Переменная« что-то »является массивом символов в обоих« * - Нет, это только массив символов во втором. –

ответ

1

Компилятор может помещать цитированные строки в сегменты только для чтения и объединять повторяющиеся строки с кавычками и в противном случае предположить, что вы никогда не будете писать в строку с кавычками. Но язык зависит от того, что строка в кавычках претендующей быть char*, даже если это действительно имеет смысл только, что дизайн выбор языка в char const*

, что строка в кавычках является char* необходимо для совместимости C, но является нечетное поведение для тех, кто работает на C++.

Синтаксис char something[] = "hello\n"; - это еще одна странность совместимости с C и отличается от обычного значения цитируемой строки. Кавычка может существовать или вообще отсутствовать во время выполнения (что проще всего для компилятора). Массив char инициализируется в соответствии с тем, какова была бы строка с кавычками, если бы она существовала. Но тогда это массив символов, а не строка с кавычками, поэтому он свободно записывается.

Смежные вопросы