[英]Why does strlen return different values when the string is given directly and when the string is read?
[英]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.