2008-09-08 203 views

回答

22

之間的差別,因爲你已經宣佈的尺寸,兩個聲明是完全平等的。但是,如果不指定大小,你可以看到,第一個聲明中作出較大的字符串:

char a[] = "a\0"; 
char b[] = "a"; 

printf("%i %i\n", sizeof(a), sizeof(b)); 

打印

3 2 

這是因爲有兩個空值的結束(顯式之一,隱含的),而b僅以隱式結束。

1

除非我弄錯了,否則第一個會將2個字符初始化爲0('\ 0'和始終存在的終止符,其餘不變,最後只會初始化1個字符(終止符)。

+0

數組的尾部字節也將爲零字節。 – 2014-10-09 04:02:50

3

正如其他人所指出的那樣,「」意味着一個終止「\ 0」字符,所以「\ 0」實際上初始化兩個空字符數組。

一些其他的應答者已經暗示,這是「同「,但這並不完全正確,可能沒有實際區別 - 只要使用數組的唯一方法就是將其引用爲以第一個字符開頭的C字符串,但請注意,它們確實導致了兩個不同的記憶initalizati特別是它們在Str [1]絕對爲零還是未初始化(根據編譯器,操作系統和其他隨機因素可能是任何東西)方面有所不同。這個數組有一些用法(可能不是有用的,但仍然)會有不同的行爲。

+0

在問題的上下文中,指定數組的大小時,結果是相同的 - 字母「a」後面跟着31個空字節「0」。只有在未定義數組的情況下才會有區別。 – 2014-10-09 04:02:31

-4

沒有區別。它們都會在未聲明的符號上產生編譯器錯誤。 :P

+0

假設你指的是代碼爲Str [32] =「\ 0」;`和Str [32] =「」的問題的原始版本,並斷言這些應該會產生編譯器錯誤。當然,這取決於上下文。如果被視爲「定義」(因爲它們在問題的修訂版本中),那麼類型(`char`)就會丟失。如果你假設`char * Str [33];`作爲先前的定義,那麼兩者都是有意義的(但指向的字符串是不同的),但與其他答案假設不同。這個答案沒有幫助,因爲它沒有解釋爲什麼。 – 2014-10-09 15:09:24

16

那麼,假設兩種情況如下(以避免編譯器錯誤):

char str1[32] = "\0"; 
char str2[32] = ""; 

正如人們所說的,str1和兩個空字符初始化:

char str1[32] = {'\0','\0'}; 
char str2[32] = {'\0'}; 

然而根據C和C++標準,如果數組的一部分被初始化,則數組的其餘元素將被默認初始化。對於一個字符陣列,剩餘字符是初始化所有零(即空字符),所以陣列是真的初始化爲:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 

因此,在端部,確實在兩者之間沒有差別。

+0

重要觀察! – jfm3 2008-09-16 21:36:46

1

嗯那麼用指針初始化呢?

char *myString = "Here is a string"; 

雖然傳統的原因,我更喜歡用:

unsigned char *myString = "Here is a string"; 

在這種情況下,空終止是由編譯器嵌入。 您可以將指針指向另一個字符串,並且您指定任意長度的字符串都是獨立的 。