2010-08-09 60 views
4
char firstName[32]; 

我知道每個char在內存中佔用1個字節。上面是否佔用32字節的內存?C風格字符數組 - 我們存儲多少個字節?

我是否缺少一個佔用內存的指針,或者這只是32字節?

+0

數組的大小是每個標準的元素數乘以每個元素的大小。所以是的,因爲你有32個元素,每個元素的大小都是1('sizeof(char)'總是1),總大小爲32. – GManNickG 2010-08-09 19:06:27

回答

10

不,這佔用了32個字節的內存。 沒有指針。

這往往是混亂的區域中,由於數組名靜默「衰減」發送「字符*」

char* fname = firstName; 

所以,firstName可以是const char*類型的,但它本身不是一個char *變量。它完全是這樣的:

int x = 5; 

x是int變量並佔用空間。另一方面,5只是int類型的一個常量值。它沒有空間;這只是一個價值。

1

這只是32個字節。數組的名稱有時候會像一樣指向指向第一個元素,但它的不是的一個指針。

2

它佔據了32個字節的內存,內部是一個地址。變量僅供我們理解。

-1

在調試版本中,還有字節存儲在數組之外(在某些編譯器上)以檢查數組之後的寫入。在發佈版本中,它應該是32個字節加棧中的一個int(可能)來存儲地址。

+0

如果它不是動態分配的,堆棧中沒有整數。地址在編譯時已知,所以不需要存儲。 – siride 2010-08-09 19:00:29

+0

爲什麼會有任何需要將地址存儲在堆棧上?如果它存在,也不是一個「int」,而是一個「char *」,它不一定是一樣的東西。 – 2010-08-09 19:01:40

+0

沒有額外的int。 – 5ound 2010-08-09 19:01:41

1

佔用32個字節。它將保存一個31個字符的字符串(另一個字節用於空字符串終止符)。

+4

我會說*可以*持有一個「31個字符的空字符結束」。它不必以null結尾,或者甚至是一個字符串。 – GManNickG 2010-08-09 19:04:02

0

語句char firstName[32]堆棧上創建32個字符或32個字節的數組。由於它位於堆棧上,因此編譯器確切知道它與堆棧指針相關的位置。編譯器會將數組的地址硬編碼爲任何使用它的操作;沒有必要存儲一個指針。

請務必注意,如果您嘗試將此數組作爲函數參數傳遞,它將降級爲指向數組的指針,因爲C++不允許按值傳遞基元數組。大多數對C++不熟悉的人會期望它傳遞一個數組副本。

+3

它不一定在堆棧上。它可能是全球性的。它可能是結構的一部分。 – 2010-08-09 19:16:37

0

需要時有兩種方法可以去,例如, 32個字節,用於存儲您的數據。在這兩個版本的區別:

// version 1 
char *firstName = new char[32]; 

// version 2 
char firstName[32]; 

是,版本1的空間上分配你的數據,你必須釋放程序結束之前,而在2版的空間是堆棧。兩者都會給你一個指向可用空間的第一個字節的變量,在這兩種情況下這個空間都是32字節。人們會爭辯說,你有可能想要choose one over the other,但這是一個不同的故事。

的sizeof(名字)

有趣的一點是什麼的sizeof將返回,這是一個字符指針的大小,版本1和32(取決於你的系統和編譯器)爲第2版。請介意另一個用戶提到的,將名字轉換爲一個函數將其降級爲指針。