51单片机C语言数组问题

这是51单片机流水灯的hex数组
uchar code table[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
当程序运行到table[9](或者比9大的数时),取值经烧录后验证是0x00;
然而,

这是51单片机的段选Hex码(0~F)
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
当我取到17,18,19时,数码管分别显示对应的HEX为0x78,0x7F和0xE4的码(不是乱码,每次都是对应且确定的)
C语言的定义当取值超过数组个数是,应该是什么情况呢?是默认输出0还是会报错?至少我用keil编译的时候,没有报错.

值是不确定的,不同的编译器会用不同的值填充未知的内存区域,而且你确实不必在意到底的是什么值,毕竟数组越界本身就不该发生追问

之所以有这个疑问是因为看到了一个有关蜂鸣器的例程,程序里有一个for循环:
for(i=0;SONG_LONG[i]!=0;i++)
{
STH0=SONG_TONE[i]/256;
STL0=SONG_TONE[i]%256;
TR0=1;
time=SONG_LONG[i]*800;
delay(time);
}
这个程序好像就是认为当i的取值大于数组的元素个数是,会取0而退出for循环,如果是未知不确定的,那就不能控制了

追答

我猜是SONG_LONG数组的唯一一个为0的元素就是最后一个元素吧,否则这种写法是危险的

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-01-13
看看你主函数的printf语句中有什么问题没,是不是只输出3个,所以数组TB【】中的TB[3]=D没有输出
相似回答
大家正在搜