C语言数组赋值。
为什么 r 数组一开始的长度为2?
最后长度又为什么变成了18?
而且值为啥是987654321123456789?
回答
脏数据吧,因为你没初始化,在我的电脑上输出是 3。
strlen(s)
纯粹计算从 s
位置到第一个 '\x00'位置的长度,因此只能用于以 '\x00' 结尾的字符串,而你的 r[9]
没有。
printf("%s", s)
同理。
实际上,char s[] = "123456789"
会自动编译成 'x00' 结尾,因此,s
在运行时占用 10 个字节,像这样 "123456789\x00".
这段程序应该每运行一次的结果都不完全一致。具体原因是这样:
这个问题想说明白不太容易,我以下瞎说,你就瞎看吧。
char s[] = "123456789", r[9];
相当于定义了s数组,具体存到内存中占用了10个连续存储单元,其实1-9分别占用一个字节,最后系统还默认添加了00000000到最后一个字节中,为了标识字符串结束。
在进行strlen(s)时,该函数由s的首地址开始查找,查找到00000000的结束符结束,返回长度为9是正确的。
31 32 33 34 35 36 37 38 39 00 内存地址的实际值1 2 3 4 5 6 7 8 9 \0 转换为ascii后的值
s 内存指针
r[9]就比较随机了,该语句代码划分一段长度为9的内存空间,并将此空间的首地址给r。但由于该内存中本来就存在以下值(假设):00001100 00101010 00000000 ....
,所以在进行strlen(r)时,同样是由首地址开始找,找到第三个00000000结束符后结束,返回长度为2.
?? ?? 00 ?? ?? ?? ?? ?? ?? 内存地址的实际值? ? \0 ? ? ? ? ? ? 转换为ascii后的值
s 内存指针
打??代表不知道其具体值,但前两个??的值必然不是00。
由于内存中的值是不固定的,所以这个2必然也是随机的,这次可能为2,下次还可能为3,4,5,这个依赖于当前内存中数据的实际情况。
长度变成18原因,也是根据当前内存情况决定的。由于在运行程序的时候恰恰这样的分配的内存:
?? ?? 00 ?? ?? ?? ?? ?? ?? 31 32 33 34 35 36 37 38 39 00 内存地址的实际值? ? \0 ? ? ? ? ? ? 1 2 3 4 5 6 7 8 9 \0 转换为ascii后的值
r s 内存指针
其中\0
为字符串结束符,在内存中的值为00000000,转成16进制简写为00
然后当执行你上面的程序后,最后变成了这样:
39 38 37 36 35 34 33 32 31 31 32 33 34 35 36 37 38 39 00 内存地址的实际值9 8 7 6 5 4 3 3 2 1 2 3 4 5 6 7 8 9 \0 转换为ascii后的值
r s 内存指针
此时当我们在执行strlen(r)以及打印其值时,仍然是由r的起始位置开始,一直找到 00 结束符。这也就是你后面两个问题产生的原因。
以上是 C语言数组赋值。 的全部内容, 来源链接: utcz.com/a/40928.html