-3

我有以下代码:

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

4

2 回答 2

2

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

char x[] = "foo";

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

char *x = "foo";

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

于 2013-10-18T19:59:31.933 回答
1

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

于 2013-10-18T19:57:23.530 回答