char指针参数的不同行为

时间:2013-10-18 19:53:58

标签: c++ pointers function-calls

我有以下代码:

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矢量运行它。 当我尝试使用第二种方法运行时,它会生成运行时错误。 我想知道这种行为的原因。

2 个答案:

答案 0 :(得分:2)

您无法修改字符串文字;这样做(如第二种情况)是未定义的行为。

char x[] = "foo";

创建一个包含字符f,o,o,\0的字符数组。它基本上是字符串的可变副本。

char *x = "foo";

创建一个指向"foo"字符串文字的字符串指针。文字可以存在于某些只读存储器中,程序存储器中或常量池中。写入它是未定义的行为。此外,不是字符串文字的类型总是const char[],因此将其分配给char *违反了const-correctness。

答案 1 :(得分:1)

前者创建一个可以变异的字符数组,后者是一个指向固定内存的指针(不能被操作)