2013-07-02 75 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

相關問題