评估数组的大小

时间:2012-11-28 18:33:47

标签: c sizeof

  

可能重复:
  How to find the sizeof(a pointer pointing to an array)

c

编写的示例代码
#include<stdio.h>

int main()
{
    char a[]="Visual C++";
    char b[] = "Visual\C++";
    printf("%d, %d\n", sizeof(a), sizeof(b));
    printf("%d, %d", sizeof(*a), sizeof(*b));
    return 0;
}

输出

11,10

1,1

1。)为什么 sizeof(a) 会显示11,但它只有10个字符。

2。)为什么 sizeof(a) sizeof(b) 显示不同的输出,但是,它们的字符数相同。

6 个答案:

答案 0 :(得分:3)

因为字符串末尾有null\0),\C被解释为单个字符。

如果要在C字符串中显示反斜杠,则必须使用另一个反斜杠将其转义。

char b[] = "Visual\C++";  \\ 10 characters including the null terminator
char b[] = "Visual\\C++"; \\ 11 characters including the null terminator

答案 1 :(得分:0)

1 - 因为字符串上有一个00字节(也就是空终止符),包含在sizeof

2 * a是字符串中的第一个字符 - 1个字符的大小是1

答案 2 :(得分:0)

a包含10个字符,加上终止空('\0')字符;因此大小是11。

ab不包含相同数量的字符。在b中,\C部分被视为转义序列,并被计为一个字符。如果您希望显示\,请使用"Visual\\C++"

答案 3 :(得分:0)

第1点:

“Visual C ++”length = 11 / *包括空字符* /

“Visual \ C ++”length = 10 / *包括空字符和'\ C'被解释为一个字符。

第2点:

*a表示您正在访问第一个字符。

*a&lt; =&gt; a[0]两者都相同。

a[0]在您的案例中为“V”,其长度为1

答案 4 :(得分:0)

从角色立场来看:

char a[]="Visual C++";

printf("length = %d\n", strlen(a));
for(int i = 0; i<strlen(a); i++)
    printf("a[%d] = %c (ASCII %d)", i, a[i], a[i]);

使用这样的代码,您将获得

length = 11
a[0] = V (86)
a[1] = i (105)
a[2] = s (115)
a[3] = u (117)
a[4] = a (97)
a[5] = l (108)
a[6] =   (32)
a[7] = C (67)
a[8] = + (43)
a[9] = + (43)
a[10] =  (0)

根据ASCII Table检查这些值,您可以看到它显示为11的原因(NULL终结符)

char b[] = "Visual\C++";

你的第二个字符串中有一个转义字符\,有很多lists of them,但它基本上告诉编译器忽略下一个字符,因为它不是印刷,但特别的东西。就像换行符:'\n'

一样

根据你对原帖的评论,我想我需要澄清两件事:

额外注1: 特殊字符,例如换行符'\n'或空终止符'\0'只占用1个额外字节的空间。

额外注2: sizeof(a)将为您提供数组的大小(字符数),因为它的字符数很多,每个字符只占1个字节。如果您在占用更多空间的其他类型上使用此功能,则需要再执行一步:

int arr[4] = {0};
int size_of_arr = sizeof(arr/sizeof(int));

答案 5 :(得分:0)

在作为宏的linux内核中:

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))