2013-08-30 137 views
2

爲什麼不能正常工作?字符串的聲明和初始化

#include<stdio.h> 
int main() 
{ 
char ch[50]; 
ch[50]="manipulation"; 
puts(ch); 
} 

爲什麼這個工作?

#include<stdio.h> 
int main() 
{ 
char ch[50]="manipulation"; 
puts(ch); 
} 

通過「它的作品」我的意思是我得到我想要的輸出,即作爲標準輸出「操縱」(不帶引號)的打印。

+0

閱讀[char * str'和'char str []'之間的區別以及兩者如何在內存中存儲?](http://stackoverflow.com/questions/15177420/what-does-sizeofarray-return/15177499# 15177499) –

回答

1

它不會因爲與句法工作:

ch[50]="manipulation"; 

你指定字符串「操縱」,以通道的50元。 這是不可能的,因爲數組由單個字符組成,並且您將字符串分配給單個字符。此外,ch有0到49的元素,並且沒有第50個元素。

如果我的解釋有問題,請告訴我。抱歉我的英文不好。

+0

最夯實的解釋。 – chanzerre

1
  1. ch[50] = "manipulation"是無效的語法。更接近於ch = "manipulation",但數組不是可修改的左值,所以你不能分配給他們。使用strcpy(3),或聲明ch作爲指針來代替:

    strcpy(ch, "manipulation"); 
    

    char *ch; 
    ch = "manipulation"; 
    
  2. 你的第二個例子是一個初始化,而不是一個賦值表達式。此表單創建一個數組ch並複製提供的字符串文字以初始化它。

+0

不,在聲明中表示「初始化」。它必須與表達式不同,因此您可以在全局範圍內使用它或使用靜態存儲持續時間初始化對象。 –

1

你不能分配裸C數組,這就是爲什麼。第二種情況根本不是分配,而是初始化。

如果你想分配數組,你可以通過在結構包裹他們實現這一目標:

struct Char50 { char data[50]; }; 

struct Char50 x; 
struct Char50 y = { "abcde" }; 
x = y; 
puts(x.data); 

處理字符串的更地道的方式是strcpy,雖然,例如strcpy(ch, "abcde");,但您必須小心目標緩衝區大小。