2012-01-04 49 views
-2

說我這樣做初始化一個這樣的數組:爲什麼有人會初始化C中未分配的內存?

char a[]="test"; 

什麼是這樣做的目的是什麼?我們知道內容可能會立即發生變化,因爲它是未分配,因此爲什麼有人會像這樣初始化數組?

+1

你是什麼意思「未分配」?在這種情況下,堆棧中分配了「a」。 – elmo 2012-01-04 11:49:49

+0

是什麼讓你覺得'a'沒有被分配?你的例子等同於'char a [5] =「test」;' – 2012-01-04 11:50:39

+0

又如何被使用? – Mark 2012-01-04 11:52:20

回答

5

爲了澄清,這個代碼是錯誤的,由OP陳述的理由:

char* a; 
strcpy(a, "test"); 

正如其他響應所指出的,語法「char a [] =」test「」實際上並沒有這樣做。實際效果更是這樣的:

char a[5]; 
strcpy(a, "test"); 

第一條語句分配本地堆棧上的固定大小的靜態字符數組,並在它的第二初始化數據。大小由字符串文字的長度決定。像所有的堆棧變量一樣,該數組在退出函數作用域時自動釋放。

+1

+1:沒有你的答案我不會理解OP的問題 – pmg 2012-01-04 12:31:59

1

這樣做的目的是在堆棧或靜態數據段上分配5個字節(取決於此段的出現位置),然後將這些字節設置爲數組{'t','e','s','t','\0'}

1

該語法分配的五個字符棧上的陣列,相當於此:

char a[5] = "test"; 

陣列的元件初始化到給定爲一個初始化字符串中的字符。數組的大小被確定爲適合初始化器的大小。

1

它被分配。該代碼相當於

char a[5]="test"; 

當你離開的數量時,編譯器只需在文本字符串計數的字符計算字符數組,你的長度。然後它將長度加1以包含必要的終止nul '\0'。因此,陣列的長度是5,而字符串的長度是4。

+0

長度字符串是4,它的大小是5. – ouah 2012-01-04 12:52:41

+0

@ouah,更新了我的。感謝您的反饋以及任何進一步的反饋。 – 2012-01-04 13:02:48

0

該陣列被分配爲;它的大小是從用來初始化它的字符串文字(總共5個字符)中推斷出來的。

假如你寫

char *a = "test"; 

那麼所有會得到分配將是一個指針變量,而不是一個數組(字符串文字"test"生活在內存中,以便它在程序啓動時分配,並一直保持到退出程序)。