请问大牛,为什么s的字节数是10个,t的字节数是6个啊?不是赋值的时候系统默认加一个'\0'在后面吗?那s的字节数应该是11个啊。
sizeof()
输出的内容是char[]
的长度, 当指定长度时只输出当前长度,具体求字符串长度还是选择strlen()
#include <stdio.h>
int main()
{
char s[2] = "123322";
printf("数组长度%d" , sizeof(s));
printf("\r\n");
printf("字符串=%s",s);
printf("\r\n");
char t[] = "132";
printf("字符串长度%d",strlen(s));
printf("\r\n");
printf("字符串长度%d",strlen(t) );
printf("\r\n");
printf("数组长度%d",sizeof(t) );
return 0;
}
输出结果
数组长度2
字符串=12
字符串长度2
字符串长度3
数组长度4
s[10]
是一个定长数组,sizeof
运算符获取到 s
的内存大小永远是 10
。
注:你给定长数组 s[10] 赋值 "abcdeadsir" 的行为,让 s 造成了数组溢出的严重漏洞。
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
sizeof
不是求字符串长度的。char s[10] = "abcdeadsir"
:s
是char[10]
,是一个含有 10 个元素的数组,那么sizeof(s)
就是 10 ,不管你用什么去初始化它。注意
sizeof("abcdeadsir") == 11
,会包含最后的'\0'
。char t[] = "12345"
t
的长度会推断为 6 ,所以t
的类型是char[6]
,含有 6 个字符的数组。C11 draft n1570:
用字符串常量初始化数组,如果没有数组里已经没有空间,那么最后的
'\0'
会被丢掉。在上面的初始化之后,s
不是以'\0'
结尾的。strlen
一类的函数将不能用于s
。