簡體   English   中英

sizeof()顯示不同的輸出

[英]sizeof() showing different output

這是一段C99代碼:

int main(void)
{
    char c[] = "\0";
    printf("%d %d\n", sizeof(c), strlen(c));

    return 0;
}

該程序正在輸出2 0 我不明白為什么sizeof(c)意味着2 ,因為我將c定義為一個字符串文字,它立即被NULL終止。 有人可以解釋為什么會這樣嗎? 你能否提供(某些)資源,我可以在我自己的時間進一步研究這種現象。

不明白為什么大小顯示2。

字符串文字具有隱式終止空字符,因此ch[]實際上是\\0\\0 ,因此大小為2。 從第6.4.5節C99標准的字符串文字 (草案n1124),第5節:

在轉換階段7中,將值為零的字節或代碼附加到由字符串文字或文字產生的每個多字節字符序列

對於strlen() ,它在遇到第一個空終止字符時停止計數。 返回的值與包含該字符串的數組的sizeof無關。 ch[]的情況下,將返回零,因為數組中的第一個字符是空終止符。

在C中, ""表示: 給我一個字符串,並為我終止它

例如, arr[] = "A"完全等同於arr[] = {'A', '\\0'};

因此"\\0"表示: 給我一個包含空終止的字符串,然后null為我終止它。

arr [] = "\\0" “相當於arr[] = {'\\0', '\\0'};

"\\0""" 字符串文字是以nul結尾的,因此第一個與復合文字(char){ 0, 0 }而第二個只是(char){ 0 } strlen發現第一個字符為零,因此假定字符串結束。 這並不意味着數據結束。

將字符串文字聲明為:

char c[]="\0";

它的末尾已經有一個'\\0'字符,因此sizeof(c)給出2因為你的字符串文字實際上是: \\0\\0

strlen(c)仍然給出0因為它在第一個\\0處停止。

strlen測量到第一個\\ 0並給出\\ 0之前的字符數,所以答案為零

char x []上的sizeof給出了以字節為單位的存儲量,即2,包括字符串末尾的explict \\ 0

好問題。 考慮一下......

ubuntu@amrith:/tmp$ more x.c
#include <stdio.h>
#include <string.h>

int main() {
  char c[16];
  printf("%d  %d\n",sizeof(c),strlen(c));
  return 0;
}
ubuntu@amrith:/tmp$ ./x
16  0
ubuntu@amrith:/tmp$

還要考慮這個:

ubuntu@amrith:/tmp$ more x.c
#include <stdio.h>
#include <string.h>

int main() {
  int c[16];
  printf("%d\n",sizeof(c));
  return 0;
}
ubuntu@amrith:/tmp$ ./x
64
ubuntu@amrith:/tmp$

將變量初始化為數組(實際上是c []時),sizeof(c)將為您提供數組的已分配大小。

字符串“\\ 0”是文字字符串\\ NUL \\ NUL,它占用兩個字節。

另一方面,strlen()計算字符串長度,該字符串長度是第一個終止字符的字符串的偏移量,結果為零,因此得到2,0。

暫無
暫無

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

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