說我這樣做初始化一個這樣的數組:爲什麼有人會初始化C中未分配的內存?
char a[]="test";
什麼是這樣做的目的是什麼?我們知道內容可能會立即發生變化,因爲它是未分配,因此爲什麼有人會像這樣初始化數組?
說我這樣做初始化一個這樣的數組:爲什麼有人會初始化C中未分配的內存?
char a[]="test";
什麼是這樣做的目的是什麼?我們知道內容可能會立即發生變化,因爲它是未分配,因此爲什麼有人會像這樣初始化數組?
爲了澄清,這個代碼是錯誤的,由OP陳述的理由:
char* a;
strcpy(a, "test");
正如其他響應所指出的,語法「char a [] =」test「」實際上並沒有這樣做。實際效果更是這樣的:
char a[5];
strcpy(a, "test");
第一條語句分配本地堆棧上的固定大小的靜態字符數組,並在它的第二初始化數據。大小由字符串文字的長度決定。像所有的堆棧變量一樣,該數組在退出函數作用域時自動釋放。
+1:沒有你的答案我不會理解OP的問題 – pmg 2012-01-04 12:31:59
這樣做的目的是在堆棧或靜態數據段上分配5個字節(取決於此段的出現位置),然後將這些字節設置爲數組{'t','e','s','t','\0'}
。
該語法分配的五個字符棧上的陣列,相當於此:
char a[5] = "test";
陣列的元件初始化到給定爲一個初始化字符串中的字符。數組的大小被確定爲適合初始化器的大小。
它被分配。該代碼相當於
char a[5]="test";
當你離開的數量時,編譯器只需在文本字符串計數的字符計算字符數組,你的長度。然後它將長度加1以包含必要的終止nul '\0'
。因此,陣列的長度是5,而字符串的長度是4。
長度字符串是4,它的大小是5. – ouah 2012-01-04 12:52:41
@ouah,更新了我的。感謝您的反饋以及任何進一步的反饋。 – 2012-01-04 13:02:48
該陣列被分配爲;它的大小是從用來初始化它的字符串文字(總共5個字符)中推斷出來的。
假如你寫
char *a = "test";
那麼所有會得到分配將是一個指針變量,而不是一個數組(字符串文字"test"
生活在內存中,以便它在程序啓動時分配,並一直保持到退出程序)。
你是什麼意思「未分配」?在這種情況下,堆棧中分配了「a」。 – elmo 2012-01-04 11:49:49
是什麼讓你覺得'a'沒有被分配?你的例子等同於'char a [5] =「test」;' – 2012-01-04 11:50:39
又如何被使用? – Mark 2012-01-04 11:52:20