У меня есть следующий код:
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;
}
Я заметил, что если я бегу с вектором символов, это работает.
Когда я пытаюсь запустить второй метод, он генерирует ошибку во время выполнения.
Я хотел бы знать причину такого поведения, пожалуйста.
Вы не можете изменять строковые литералы; поступать так (как в вашем втором случае) — неопределенное поведение.
char x[] = "foo";
создает массив символов, содержащий символы f,o,o,\0
, Это в основном изменчивая копия строки.
char *x = "foo";
создает указатель строки, указывающий на "foo"
строковый литерал. Литерал может находиться в некоторой постоянной памяти, в памяти программ или в постоянном пуле. Запись в него — неопределенное поведение. Кроме того, тип строкового литерала не всегда const char[]
так что присвоив его char *
нарушает const-правильность.
Первый создает массив символов, который может быть видоизменен, последний является указателем на фиксированную память (которой нельзя манипулировать)