我有以下代码:
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矢量运行它。 当我尝试使用第二种方法运行时,它会生成运行时错误。 我想知道这种行为的原因。
答案 0 :(得分:2)
您无法修改字符串文字;这样做(如第二种情况)是未定义的行为。
char x[] = "foo";
创建一个包含字符f,o,o,\0
的字符数组。它基本上是字符串的可变副本。
char *x = "foo";
创建一个指向"foo"
字符串文字的字符串指针。文字可以存在于某些只读存储器中,程序存储器中或常量池中。写入它是未定义的行为。此外,不是字符串文字的类型总是const char[]
,因此将其分配给char *
违反了const-correctness。
答案 1 :(得分:1)
前者创建一个可以变异的字符数组,后者是一个指向固定内存的指针(不能被操作)