-1

可能重复:
如何找到 sizeof(指向数组的指针)

编写的示例代码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)显示不同的输出,尽管它们具有相同数量的字符。

4

6 回答 6

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
于 2012-11-28T18:37:14.283 回答
0

在 linux 内核中是宏:

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
于 2012-11-28T19:02:14.807 回答
0

第 1 点:

"Visual C++" 长度 = 11 /* 包括空字符 */

"Visual\C++" 长度 = 10 /* 包括空字符和 '\C' 被解释为一个字符。

第 2 点:

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

*a<=>a[0]两者都是一样的。

a[0]在你的情况下是'V',它的长度是1

于 2012-11-28T18:45:13.810 回答
0

1 - 因为字符串上有一个包含在 sizeof 中的 00 字节(又名空终止符)

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

于 2012-11-28T18:37:23.573 回答
0

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

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

于 2012-11-28T18:38:08.947 回答
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 表检查这些值,您可以看到为什么它显示 11(NULL终止符)

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

你的第二个字符串中有一个转义字符\,有很多列表,但它基本上告诉编译器忽略下一个字符,因为它不是要打印的,而是一些特殊的。就像换行符一样:'\n'


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

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

额外说明 2: sizeof(a)将为您提供数组的大小(字符数),因为它充满了每个只需要 1 个字节的字符。当您在其他占用更多空间的类型上使用它时,您需要再执行一步:

int arr[4] = {0};
int size_of_arr = sizeof(arr/sizeof(int));
于 2012-11-28T18:51:44.713 回答