可能重复:
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)
显示不同的输出,但是,它们的字符数相同。
答案 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。
a
和b
不包含相同数量的字符。在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]))