2012-08-16 81 views
-2

有人問我這是什麼語法意味着:初始化字符數組 - C和C++

char data[32] = {1}; 

但是我不記得它做什麼,。但我記得它是有效的。
任何人都可以解釋它的目的嗎?

+2

http://stackoverflow.com/問題/ 201101 /如何初始化數組in-c – chris 2012-08-16 20:14:26

+4

問題的標題基本上是您的答案。 – netcoder 2012-08-16 20:14:31

+0

http://en.wikipedia.org/wiki/C_syntax#Initialization – 2012-08-16 20:16:22

回答

8

這將創建32個字符的數組。第一個元素將是1,其餘元素將被設置爲零。

2

它是初始化。它將數組的第一個元素設置爲1(在我檢查的ASCII表中爲^A),其餘爲0(默認值)。

爲了表述上省略初始化C99標準:

如果在一個大括號內的列表更少初始化值多於字面用於元件或聚集體的成員 ,或在一個字符串中更少的字符初始化一個已知大小的數組,比數組中的元素長,其餘的聚合應該是 隱式地初始化,就像具有靜態存儲持續時間的對象一樣。

和:

如果具有自動存儲持續時間的對象沒有被明確初始化, 它的值是不確定的。如果具有靜態存儲持續時間的對象是 沒有明確進行初始化,則:

  • 如果它有指針類型,它被初始化爲空指針;
  • 如果它有算術類型,它被初始化爲(正或無符號)零;
  • 如果它是一個聚合,每個成員根據這些規則初始化(遞歸);
  • 如果它是一個聯合,則根據這些 規則初始化(遞歸)第一個命名成員。

而且char是算術式,所以陣列的其餘元件將被初始化到零。

1

是的,你記得沒錯。只是谷歌的 「C數組初始化」:

有兩點要注意:

  • 在舊的,預ANSI C編譯器,你不能總是提供 函數內部「本地」數組的初始值設定項;你只能在 初始化「全局」數組,那些在任何函數之外的數組。那些 編譯器現在很少見,所以你不必再擔心這個區別。

  • 當一個數組定義包括一個初始化中,陣列 尺寸可以被省略,並且編譯器會從初始化

  • 的數量推斷尺寸 如果有初始化比數組中的元素較少,剩餘的 元素自動初始化爲0

7

如果不初始化數組自動(本地和非靜態)可言,EL數組的元素可能包含垃圾值。

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    char data[5]; 
    for (i = 0; i < 5; i++) { 
     printf("data[%d] = %d\n", i, data[i]); 
    } 
    return 0; 
} 

輸出:

data[0] = 72 
data[1] = 12 
data[2] = -118 
data[3] = 51 
data[4] = -119 

但是,如果你這樣做初始化它,它就會與你指定的初始化初始化。如果初始化符的數量小於所述陣列中的元件的總數目,剩餘的元件將被初始化爲0。

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    char data[5] = {1}; 
    for (i = 0; i < 5; i++) { 
     printf("data[%d] = %d\n", i, data[i]); 
    } 
    return 0; 
} 

輸出:

data[0] = 1 
data[1] = 0 
data[2] = 0 
data[3] = 0 
data[4] = 0 
+0

您是否必須在自己的行上打印每個元素? – 2012-08-16 20:18:46

+4

@ColinD不,但這有什麼區別? – 2012-08-16 20:19:43

+0

它使你的答案不必要很長時間。足夠長,我必須滾動閱讀所有內容,但內容不夠有意義,無法滾動。 – 2012-08-16 20:21:52