#include<stdio.h>
main()
{
char *str[]= {"Frogs","do","not","die","they","croak"};
printf("%d %d %d",sizeof(str),sizeof(str[0]),sizeof(char));
}
輸出是:sizeof(char *)和sizeof(char)的區別是什麼?
根據char
是1
字節的大小和存在六個字符變量,從而陣列的總尺寸應6
代替48
!
#include<stdio.h>
main()
{
char *str[]= {"Frogs","do","not","die","they","croak"};
printf("%d %d %d",sizeof(str),sizeof(str[0]),sizeof(char));
}
輸出是:sizeof(char *)和sizeof(char)的區別是什麼?
根據char
是1
字節的大小和存在六個字符變量,從而陣列的總尺寸應6
代替48
!
點1
sizeof
retruns數據類型的大小,不的存儲器分配給該變量的量。
對於它的價值,如果要衡量一個串的長度(即,在字符串中的元素個數),則可以使用strlen()
點2
不要混淆數據類型。
str
是一個指針數組。它包含6
指針,因此sizeof
將給出6 * sizeof(<pointer type>)
,即在64位系統上的6 * 8
或48
。str[0]
是一個指針,所以sizeof str[0]
等於sizeof(char *)
這是在64位系統上的8
。C
標準保證sizeof(char)
等於1
。點3
sizeof
操作者返回一個size_t
。您需要使用%zu
格式說明符來便攜和可靠地打印。
str
是指向char
的長度爲6的指針陣列。它的總大小是一個指針大小的6倍,在你的平臺上有48個大小。
看來你是一個64位系統上,其中sizeof (char *)
爲8
這解釋了第一個值,因爲sizeof str
是對象str
,其類型爲char *[6]
的大小。所以你得到的大小爲48,這當然是6 * 8
的同時,有道size_t
類型,這是什麼sizeof
的回報,是%zu
的printf()
值。
printf
的格式說明%d
是不合適的參數值sizeof(str)
和sizeof(str[0])
其類型是size_t
。
您應該使用%zu
或將參數轉換爲(int)
。
還有更多的問題與您的代碼:
main
返回類型必須指定爲int
。str
的類型應該是const char *str[]
。\n
到printf格式,以確保輸出ID在所有系統上正確刷新。下面是一個改進版本:
#include <stdio.h>
int main(void) {
const char *str[] = { "Frogs", "do", "not", "die", "they", "croak" };
printf("%zu %zu\n", sizeof(str), sizeof(str[0]));
}
它應該分別32位和64個的系統,並有可能對更多的外來系統其他值輸出24 4
或48 8
。第一個數字是指向const char
的6個指針的大小,第二個數字是單個指針的大小。
字符串本身的大小可以在編譯時針對常量直接字符串和定義數組確定,只能作爲sizeof
的直接參數。在其他情況下,假設它們不包含嵌入式NUL,則必須使用strlen()
來計算字符串長度,併爲最終的'\0'
加1。
數組聲明如下
char *str[]={"Frogs","do","not","die","they","croak"};
已鍵入char *[6]
。這是對角色的六分之一指針。因此str[0]
有char *
類型,即它是一個指針。
因此
sizeof(str[0])
相當於
sizeof(char *)
,並且系統是等於8
反過來
sizeof (str)
相當於
6 * sizeof(char *)
和等於48
考慮到,在此初始化列表
char *str[]={"Frogs","do","not","die","they","croak"};
字符串文字隱式轉換爲指針到他們的第一字符。
。如果將例如
sizeof("Frogs")
寫那麼表達式將等於6監守1)字符串文字另一方面是包括終止零字符陣列和2)的操作者內的sizeof它們不隱式轉換爲指向其第一個字符的指針,它們被視爲數組。
可以定義串的二維陣列以如下方式
char str[][6] = { "Frogs", "do", "not", "die", "they", "croak" };
在這種情況下
sizeof(str[0])
將等於6和
sizeof(str)
將等於36,因爲在這種情況下str
是類型的元素的數組0
注重的是,在最後一種情況下,當你有指向字符串常量數組(如在原來的職位),你可以改變數組的元素通過以下方式
str[0][0] = 'f';
雖然你可能不寫
str[0][0] = 'f';
因爲字符串文字是不可變的。
還有一個關於sizeof
運營商。根據C標準(6.5.3.4 sizeof運算和alignof運營商)
2 sizeof運算符產生的尺寸(字節)其操作數, 的其中可以是表達或的括號名稱類型。大小由操作數的類型決定。結果是一個 整數。如果操作數的類型是可變長度數組類型,則對操作數進行求值;如果操作數的類型是可變長度數組類型,則返回0。否則,操作數不會被評估,並且結果是一個整數常量。
因此,應用於數組時,運算符會產生數組佔用的字節數。它不會產生數組中元素的數量。如果你想獲得數組中元素的個數,你應該使用表達
sizeof(array)/sizeof(array[0])
或
sizeof(array)/sizeof(*array)
@Sourav Ghosh謝謝,這是一個錯字。 –
是的,我使用的是64位系統 –
由於你是在64位,你不應該打印'size_t'使用'd'轉換說明符鍵入「值」,因爲這需要可能是32位寬的'int',而不是'size_t',它預期爲64位寬。 – alk
爲什麼你會期望'sizeof(T)'與'sizeof(T *)'相同?它們是不同的類型,爲什麼它們的大小應該相等? –