2015-09-30 29 views
2

其他問題(1分): 假設我們使用的是32位Windows操作系統 和C/C++程序。請估計的sizeof()爲如下(單位:字節)有關C++中各種數據類型的sizeof()的說明

我試圖總結我的腦海解決此相當基本的概念在C++

• char str[] = 「Hello」 ; 
• char *p = str ; 
• int n = 10; 
Please calculate: 
• sizeof (str) = __________ 
• sizeof (p) = __________ 
• sizeof (n) = __________ 

您好所有。我會告訴你我認爲正確的答案是看我是否在正確的軌道上。對於第一個sizeof(str),我相信它總共是6個字節。我注意到其他問題的模式,總是有1個字節添加到這些類型的字符串中。 (5個字母+1)。我的問題是,這是從什麼「+1」?至於第二個下來,這只是指一個指針的大小,p,是正確的?這總是4個字節的大小?最後,第三個,我相信只是指一個int,n的大小。從我所知道的所有整數都是4字節大小正確的?這是否意味着所有整數都是4個字節,無論它是10還是10000,或者其他任何數字。關於這個話題的任何其他重要信息也非常感激,並張開雙臂接受!謝謝!

+0

首先是6.最後兩個取決於實現。 – Lingxi

+0

對於32位Windows,ints和指針都是4個字節。 – 1201ProgramAlarm

回答

0

我注意到其他問題的模式,總是有一個字節 添加到這些類型的字符串中。 (5個字母+1)。我的問題是,什麼 是這個「+1」?

這1個字節用於空終止,即'\ 0'。 想一想。

如果使用strlen(在運行時計算)而不是sizeof(在編譯時計算),strlen()會在第一個字符開始掃描字符串,增加計數,移動到下一個字符,必須有一些字符在哪個字符串必須標記它的結束,對嗎?這就是null終止的目的。

從我所知道的所有整數的大小是4字節正確嗎?

C++標準沒有規定整型字節的大小( ),但它指定了它們必須遵守的最小範圍。

這已經在這裏解釋了。 [What does the C++ standard state the size of int, long type to be?

好的做法是總是使用標準定義來避免這種混淆。

查找到

「stdint.h」 或 「cstdint」 如果你是在Linux上

頭文件。不確定窗口。

中int8_t,int16_t,int32_t和uint8_t,uint16_t,uint32_t的

這些使代碼更具有可讀性。

+1

'sizeof'不掃描字符串的大小。這是一個編譯時間常量。 – 1201ProgramAlarm

+0

相應地改變了它。 – basav

+0

'stdint.h'是C標準頭。 ['cstdint'](http://en.cppreference.com/w/cpp/header/cstdint)是C++頭文件,而不是'cstdint.h'。 – CoffeeandCode

1
char str[] = "Hello" ; 

相當於:

char str[] = {'H', 'e', 'l', 'l', 'o', '\0'}; 

標準保證sizeof(char)1。因此sizeof(str)6

一個指針的大小和int總是依賴於平臺。在計算器

1

好了我的第一個答案

第一個問題:

char str[] = "Hello"; 

在C/C++字符數組需要一個空終止( '\ 0')或(NULL)來識別字符數組的結束,當我們正在閱讀的字符數組指針置於第一指數和它循環,直到我們找到空終止character.Hence其尺寸是6

注意空終止字符VA從編譯器到編譯器(根據我的知識),通常它們使用'\ 0'。 你也可以使用零(0);

char s[] = {'H','E','L','L','O',0}; 

或 'NULL'

char s[] = {'H','E','L','L','O',NULL}; 

第二個問題:在字符數組 'STR' 的

char *p = str 

字符指針 'P' 存儲地址它指向字符數組的第一個索引並存儲地址。 這是4個字節。因此,你會得到

  • sizeof (p) = 4 // p holds the address of str

這裏,如果你已經使用* P(以P值),那麼你就已經收到價值1

• sizeof (*p) = 1 // Now *p is value at p i.e first element in 
       character array = 'H' which is of size 1 byte 

第三題

int n = 10 

Ť他顯然會給你在32位系統上的大小爲4個字節(8位)。

同樣的也大小因編譯器而異。

談論你的最後一個問題

這是否意味着所有的int爲4個字節不管其10或10000,或 任何其他數目

答案是肯定的,沒有 對於C/C++的16位編譯器signed int的範圍是-32768到32767。

對於32位編譯的範圍是-2147483648到2147483647

任何數量(類型符號的int)之間的該範圍是要採取在32位編譯器等的Turbo C

4個字節

關於這個主題的其他重要信息也大爲讚賞,並接受張開雙臂

有趣的事實 10對於上面如果

int n = 2147483648 //note the extra 1 

是仍然要打印或存儲

2147483647 in n 

立即嘗試(在32位編譯器)

其次用C ++字符串即

string str = "Hello"; 
• str.size() = 5 // note: its not 6 

我希望我回答了您的問題並提供了其他信息。

+0

'int n = 2147483648'是未定義的行爲,可能會打印爲2147483647,21447483648,-2147483647,0或''你被解僱了',或者格式化硬盤而不是打印任何東西。 – MSalters

+0

@MSalters感謝您指出「未定義的行爲」,我會記住這一點。 – VoidZero

+0

非常感謝這非常明確的故障! – enigma

0

在C++中,如果我們傳遞一個數組到sizeof,我們可以得到它的長度;不是它衰減到尺寸的指針。字符串文字是具有空終止符的n字符的數組。

所以對於

const char str[] = "foobar"; 

sizeof(str) == 7因爲在現實中,它會成爲了在內存中是這樣的:

const char str[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'}; 

這是一個編譯時間常數,是由編譯器就知道該數組已定義。

如果你把一個指針指向數組const char *strp = str,然後sizeof(strp) == sizeof(char*)


至於intT*(其中T是任何對象類型)的大小,它是實現定義。但是sizeof(T*) == sizeof(U*) == sizeof(void*)其中TU是任何對象類型。

您得到的唯一保證是sizeof(char) == 1。其他任何事情都取決於實施。

N4140(C++ 14標準草案)

§3.9.1基本類型
2 - 有五種標準符號整數類型:「符號字符」,「短整型」, 「int」,「long int」和「long long long long」。在這個列表中,每種類型至少提供與列表中前面那些相同的存儲空間。 也可能有實現定義的擴展有符號整數類型。標準和擴展簽名 整數類型統稱爲有符號整數類型。普通整數具有執行環境的 架構建議的自然大小;提供其他有符號整數類型以滿足特殊的 需求。

所以,你得到的實際保障是:

sizeof(signed char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 

signed char是大小爲char相同,但一個獨特的類型和unsigned char是相同的大小既但彼此不同類型的一次。


在另一方面,與大多數系統將是這樣的:

64位操作系統,sizeof(T*) == 8
32位操作系統,sizeof(T*) == 4

和在64和32位系統sizeof(int)通常爲== 4

其中T是任何對象類型

+0

我不認爲'sizeof(T *)== sizeof(void *)'是有保證的。由於'void *'必須能夠保存指向_any_對象的指針,所以'sizeof(T *)<= sizeof(void *)'很可能,但是特別惡劣的編譯器可能會在T *中添加不需要的填充位。有點不那麼邪惡,指向數組的'T *'可能會保存緩存的數組大小。這在調試模式下很有用。但是由於沒有'void []''void *'可能不會得到相同的計數。 – MSalters

+0

@MSalters數組的大小不是指針本身的一部分,而是指向指針前的幾個字節*。無論如何,如果我要這樣做,那就是我的方式。但是,標準保證指向對象的指針的大小始終是相同的大小,void *是指向未知類型對象的指針。這就是爲什麼將'void *'強制轉換爲函數指針類型是未定義行爲的原因。 – CoffeeandCode