2013-07-02 78 views
2
char myArray[6]="Hello"; //declaring and initializing char array 

printf("\n%s", myArray); //prints Hello 
myArray="World"; //Compiler says"Error expression must a modifiable lvalue 

为什么我以后不能更改myArray?我没有把它声明为const修饰符。为什么我以后不能更改字符数组?

+1

您的编译器没有在此代码中引发任何警告甚至是错误吗?首先:“Hello”是一个“char const *”,因此它是一个指向常量字符的指针。所以你应该得到一个关于尝试改变常量值的错误。第二件事是:'myArray [6]'是一个左值(注意myArray它本身不是),所以你应该另外得到一个警告,比如“char与类型'char const *'的标识符不兼容”或者类似的东西。 – dhein

+0

简短的答案是因为C只是不允许赋值给数组。部分问题是数组左值在大多数情况下会衰减为非左值指针,包括在您的示例中。错误表示赋值表达式“必须是可修改的左值”,事实上它甚至不是左值。 – davmac

回答

4

当你写char myArray[6]="Hello";你是在栈上分配6 char秒(包括空终止符)。

是的,你可以改变个别元素;例如myArray [4] ='\ 0'会将你的字符串转换为“Hell”(就C库字符串函数而言),但是你不能重新定义数组本身,因为它会破坏堆栈。

请注意,[const] char* myArray = "Hello";是一个完全不同的野兽:这是只读内存和该字符串的任何更改是未定义的行为

2

myArray是你不能修改的数组的名称。为其分配一个值是非法的。 C中的数组是不可修改的lvalues。 C中没有任何操作可以修改数组本身(只有单个元素可以修改)。

那么myArray的大小为6,因此必须注意在strcpy期间。 strcpy(myArray,"World"),因为如果源的字符串长度超过目的地(在这种情况下为6),将导致溢出。在C中的数组是不可修改的左值。 C中没有任何操作可以修改数组本身(只有单个元素可以修改)。

确保您free(ptr)末否则会导致内存泄漏:如果你想改变

ptr = strdup("World"); 

注 的可能,安全的方法是

char *ptr = "Hello"; 

+0

谢谢@alk。我改变了答案。 – GeekFactory

2

您不能分配到一个数组(在其声明中初始化时,它除了。相反,你必须副本它。这个你使用strcpy

但要小心,所以你不要复制数组中有五个以上的字符,因为这是它可以包含的最长的字符串,并且在这种情况下使用strncpy可能会很危险,因为如果源字符串很长,它可能不会添加终止的'\0'字符

4

数组是一个不可修改的左值,所以你不能修改它。如果您希望修改数组的内容,请使用strcpy

2

您不能在C中分配裸集。但是你可以分配指针:

char const *myPtr = "Hello"; 
myPtr = "World"; 

也可以分配到一个数组的元素:

char myArray[6] = "Hello"; 
myArray[0] = 'W'; 
strcpy(myArray, "World"); 
+1

我觉得应该注意,'strncpy(myArray,“World”,5);'只能工作,因为'char myArray [6] =“Hello”;'已经照顾过'0'-终结者正确的地方,即在'myArray [5]'。 – alk

+0

在第一种情况下,其中u将myPtr重新分配给“世界”,这里请注意,“Hello”根本不会更改为“世界”,因为在任何时间点指向字符序列的指针,那么整个字符序列在你的案例中“你好”是只读的。 相反,“World”是myPtr将指向的另一个字符序列。 “Hello”仍然保留在堆栈中,直到时间堆栈展开,即函数终止。 –

3

因为数组的名称不能进行修改,只需使用strcpy

strcpy(myArray, "World"); 
2

除初始化以外,您不能将字符串分配给C中的变量。使用strcpy()函数更改C中字符串变量的值。

+0

或者您可以使用@Juraj Blaho描述的指针 – amulous

相关问题