параметр указателя символа различное поведение

У меня есть следующий код:

void uppercase(char *sir)
{

for(int i=0;i<strlen(sir);i++)
{

sir[i]=(char)toupper(sir[i]);
}
}int _tmain(int argc, _TCHAR* argv[])
{

//char  lower[]="u forgot the funny"; this works
//char  *lower="u forgot the funny";  this gives me a runtime error

uppercase(lower);

cout<<lower<<"\n\n";

system("PAUSE");

return 0;
}

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

-3

Решение

Вы не можете изменять строковые литералы; поступать так (как в вашем втором случае) — неопределенное поведение.

char x[] = "foo";

создает массив символов, содержащий символы f,o,o,\0, Это в основном изменчивая копия строки.

char *x = "foo";

создает указатель строки, указывающий на "foo" строковый литерал. Литерал может находиться в некоторой постоянной памяти, в памяти программ или в постоянном пуле. Запись в него — неопределенное поведение. Кроме того, тип строкового литерала не всегда const char[]так что присвоив его char * нарушает const-правильность.

2

Другие решения

Первый создает массив символов, который может быть видоизменен, последний является указателем на фиксированную память (которой нельзя манипулировать)

1

По вопросам рекламы [email protected]