字符串 字节数

来源:百度知道 编辑:UC知道 时间:2024/05/29 22:58:54
#include<stdio.h>
void main()
{
char a[]={"china"};
printf("%c\n",a[9]);
}
当为a[5]~a[9]超过了定义的字节范围时,有的输出为?,有的输出为空
是为什么
既然系统自动确定a的长度为5,相当于定义了a[5],a[5]之后就没有被定义,其意义就相当于任意一个未被定义的变量b,为什么系统没有报错
"a[5]以后是未分配内存空间的数据"??

a[5]之后地址越界,那么a[6].a[7]……之间的地址关系又是怎么样的,是否连续

catur没有说服力

输出a[5]的话应该永远是空白
因为字符串 "china" = "c" "h" "i" "n" "a" "/0"
a[5] = "/0" 输出到屏幕是空白
a[5]以后就没法定了 要看你所用的编译器是什么 比如VC或者DEV或者其他

可是你输出a[5]以后 完全没有意义啊! 你定义a时没给数组大小 可是系统根据china自动知道a长度是0-5. a[5]以后是未分配内存空间的数据,输出他们干嘛??

续:
“既然系统自动确定a的长度为5,相当于定义了a[5],”
兄弟!数组长度为五!那么编号应该是a[0][1][2][3][4]好吧!?
a[4]后面也不是相当于未定义的变量b,既然未定义,那就什么都不是!
不存在a6、a7……!
你让系统读取a4以后的数组元素,根本就不存在的东西,当然不会返回值了
你所说的问题发生在编译过程中,所以报错与否完全取决于你的编译器!不同的编译器是不一样的,也许我用VC++就报错,其它的就不报错
屏幕上显示空白或者问号,那完全是编译器的原因。编译器不等于计算机!

a[9]虽然越界了 但依然是一个地址 也就是说这个输出命令和a的情况差不多 会一个char一个char的输出直到'\0'为止 至于什么位置是'\0'那取决你计算机内存的使用情况 结果是不可预期的 如果恰巧是'\0'那就输出为空 如果是不大的ASCII码 那依然有可能是有意义的乱码 比如"a2b2tt" 但更常见的是完全没意义的乱码 比如不认识的汉字 奇怪的符号 或者蜂鸣器响了 等等

补充 虽然只定义到a+5 但是a+9是有地址的 举个简单的例子 如果你用指针给这个地址赋值 下次是可以正确输出的 lz问题的结果取决于计算机当时的内存使用状况 这个在运行前是给不出结果的

可能是未定义,随机产生的乱码吧。

你调试一下,看看数组中