簡體   English   中英

當'sizeof'應用於字符串時,為什么它會返回其大小(作為strlen)?

[英]When 'sizeof' is applied on a string, why does it return its size (as strlen)?

如果我有一個字符串:

char s1[]="hello, how are you?";
printf("%d\n",sizeof(s1));

它打印出確切的,正確數量的字符,但是如果我有一個由指針初始化的字符串:

char *s2;
s2=(char*)malloc(sizeof(char));
strcpy(s2,s1);
printf("%d\n",sizeof(s2));

它打印指針的大小,這取決於機器(在我的機器上,8)。 那么為什么s2為8個字節,s1為20個字節,因為它們是相同的字符串?

它們不是相同的字符串,甚至是相同的類型。 char s2[]是一個數組 ,它的大小是其元素大小的總和。 char *s2是一個指針 ,它有一個指針的大小。

sizeof()是(在C89中)編譯時運算符,它必須在編譯時知道它的參數大小。 由於指針可以來自任何地方,因此sizeof()無法知道已分配內存的大小,但是在編譯時總是給數組一個大小(C99的VLA除外),然后sizeof()可以返回大小記憶。

請記住,數組不是指針; 在一種情況下,您獲得數組的大小,在另一種情況下,您獲得指向它的指針的大小。

應用於字符串的sizeof運算符產生字符串的字符數,包括尾隨空字符。

在第二種情況下,您不是計算字符串的大小,而是計算字符串指針的大小,因此它產生指針類型的大小。

char *s2;
s2=(char*)malloc(sizeof(char));
strcpy(s2,s1);

這段代碼錯了; 你只為一個char分配空間。 您需要為整個字符串分配空間:

char *s2;
s2 = malloc(sizeof s1);
strcpy(s2, s1);

最后,關於strlen函數(因為你提到過):字符串的長度與字符串的大小不同。 字符串的長度是尾隨,終止空字符之前的字符數,而字符串的大小是包含空字符的字符串的字符數。

char s2[]是一個靜態分配的數組,它全部在堆棧上,運算符sizeof有一個可以測量靜態分配數組大小的重載版本,正如delnan所評論的那樣。

char* s2是一個指針,分配的字符串(帶有malloc )在堆上。

sizeof返回傳入的數據類型的大小。傳入char[20] ,數據類型占用20個字節,但是傳入帶有機器字的char*

這是定義。 sizeof運算符應用於數組時,它將被編譯器替換為數組的長度(在編譯階段)。 當它應用於指針時,編譯器將其替換為指針的大小。

忽略在第二種情況下沒有分配足夠內存的事實(它應該是malloc(<number of characters to be stored>+1) ),這兩個s2不是同一個東西。

在第一種情況下,你有一個數組 ; 您正在使用特殊的字符串初始化語法,該語法將導致已初始化為該字符串的正確大小的數組。 數組上的sizeof正確地以其大小(以char為單位)得到。

在第二種情況下,你有一個指針 ,它不知道它指向的有多大。 指針上的sizeof返回指針的大小,在32位機器上,指針的大小為4個字節= 32位,因為32位是存儲指向32位地址空間中每個可能的內存位置所需的所有空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM