2010-08-15 48 views
4

以下是初始化字符數組的方法有兩種:用C初始化一個char數組哪種方式更好?

char charArray1[] = "foo"; 
char charArray2[] = {'f','o','o','\0'}; 

如果兩個是等價的,人們期待大家使用上面的第一個選項(因爲它需要較少的擊鍵)。但是我看過代碼,作者總是使用第二種方法。

我的猜測是,在第一種情況下,字符串「foo」存儲在數據段中並在運行時拷貝到數組中,而在第二種情況下,字符存儲在代碼段中並複製到數組中運行。出於某種原因,作者對數據段中的任何內容過敏。

編輯:假定數組聲明爲函數本地。

問題:我的推理是否正確?你喜歡哪種風格?爲什麼?

+0

第一種風格 - 絕對。更清晰,更簡潔。與可讀性好處相比,1和2之間的perf影響可忽略不計。 – obelix 2010-08-15 11:35:18

+3

相關:http://stackoverflow.com/questions/3427750/difference-between-array-initializations和http://stackoverflow.com/questions/3429071/string-initializer-and-read-only-section – 2010-08-15 11:37:23

+0

@Prasoon謝謝爲鏈接。我發佈前搜索和搜索,但沒有找到它。編譯器「不支持第一種方法」的 – 2010-08-15 11:46:51

回答

5

什麼另一種可能性:

char charArray3[] = {102, 111, 111, 0}; 

你不應該忘記C字符類型是一個數字類型,它恰好發生該值通常用作字符代碼。但是如果我使用數組來處理與文本無關的東西,那麼我肯定會更喜歡用上面的語法對它進行初始化,而不是將它編碼爲字母並放在引號之間。

如果您不希望終端0您還可以使用在C使用第二種形式或:

char charArray3[3] = "foo"; 

這是一個幾乎沒有人知道AAÇ功能,但如果編譯器沒有當初始化一個charArray時,它足以容納最終的0,但它沒有放置它,但代碼是合法的。但是,應該避免這種情況,因爲此功能已從C++中刪除,並且C++編譯器會產生錯誤。

我檢查了由gcc生成的彙編代碼,並且所有不同的表單都是等效的。唯一的區別是它使用.string或.byte僞指令來聲明數據。但這只是一個可讀性問題,並沒有在最終的程序中有所改變。

1

我認爲第二種方法主要用於遺留代碼,其中編譯器不支持第一種方法。這兩種方法都應該將數據存儲在數據段中。由於可讀性,我更喜歡第一種方法。另外,我需要修補一次程序(不記得是哪一個,它是一個標準的UNIX工具)不使用/ etc(它是用於嵌入式系統)。我有一個非常艱難的時間找到正確的地方,因爲他們用的是第二種方法和我的grep找不到「等」任何地方:-)

+1

?它嚴格的C89,每個ANSI編譯器都應該支持這一點。 – user411313 2010-08-15 11:59:06

+0

這很好,如果你持有你的char數組來保存一些文本,如果你想存儲數字'「\ x66 \ x6f \ x6f」'肯定比'{102,111,111,0}'更不可讀(甚至有以十六進制或十進制轉換,因爲您不能使用十進制鍵入char代碼)。在某些情況下放鬆第二種形式將是一種真正的痛苦。 – kriss 2010-08-15 12:08:08

+0

@gordongekko:我認爲K&R C有很好的方法存在問題,但是一些Google搜索似乎表明,即使K&R C也支持這兩種方法...... – DarkDust 2010-08-15 12:38:45

相關問題