为什么除main之外的函数中的数组初始化是临时的?

时间:2013-06-28 05:43:13

标签: c initialization array-initialization

这是我在main和函数“checkCollisionOrFood()”中初始化数组“turn [20]”的代码,四个值转[0],转[1],转[2],转[3]在main函数中初始化为零,其余部分在“checkCollisionOrFood()”中初始化。这是故障开始的地方。当我初始化“checkCollisionOrFood()”中的turn [4] = 0然后在任何地方访问它时,它任何功能都保持0,但是!当我初始化下一轮[]即转[5]时,转[4]的值被耗尽。转[4]有垃圾值。转[20]是全局变量,其索引“头”也是全局的。我坚持这个问题PLZ帮我摆脱它。这是我的完整代码

#include <mega8.h>
#include <delay.h>
#include <stdlib.h>

unsigned short address[]=    {0b00001111,0b00000000,0b00000000,0b00000000,
  0b00000000,0b00000000,0b00000000,0b00000000};
unsigned short turn[20];//it is declared as global variable.
unsigned short head=3;
unsigned short colHead=0;
unsigned short rowHead =3;
unsigned short rowTail=0;
unsigned short colTail=0;
unsigned short size=4;
unsigned short foodx;
unsigned short foody;

...

unsigned short checkCollisionOrFood()
{
head=(head+1)%20;
if(turn[head-1]==0){
    turn[head]=0;

/ 这是转动[]的地方,如果我在这里转动[head],即在iniliazition之后然后它给出了正确的值但是如果我访问它的先前值意味着转[head-1]然后它给出垃圾值 /

    PORTB=255;PORTB&=~(1<<turn[4]);PORTD.7=0;delay_ms(200);PORTD.7=1;

/ 通过这个语句我刚刚在转动[4]之后检查了转[4]的值,这给出了正确的答案,然后在转弯[5]初始化之后,访问转[4]给出了垃圾。 / EM> /

    rowHead=(rowHead+1)%8;
    if(!(address[colHead]&(1<<rowHead)))return 1;
    else if((address[colHead]&(1<<rowHead))&&
    (!((colHead==foody)&&(rowHead==foodx))))gameOver();
    else return 0;
    }
if(turn[head-1]==1){
    turn[head]=1;
    colHead=(colHead+1)%8;
    if(!(address[colHead]&(1<<rowHead)))return 1;
    else if((address[colHead]&(1<<rowHead))&&
    (!((colHead==foody)&&(rowHead==foodx))))gameOver();
    else return 0;
    }
}
void main(void)
{
turn[0]=0;turn[1]=0;turn[2]=0;turn[3]=0;

/ turn []的这些值不论其访问位置如何都不会改变。 /

while (1)
  {
  if(checkCollisionOrFood())
    {
    PORTB=(address[colHead] |=1<<rowHead);
    turnOffTail();
    blink();
    }
  else
    {
    PORTB=address[colHead];
    createFood();
    blink();
    }
  }

}

Plz建议我摆脱它。

2 个答案:

答案 0 :(得分:0)

如果您在head中观察垃圾,这可能很容易因为访问address越界,因为它位于turn

之前的memrory中

检查address的索引,以确保您不会在其边界之外写入,并在下一个变量中使用此覆盖数据,即turn

答案 1 :(得分:0)

unsigned short checkCollisionOrFood()
{
    head=(head+1)%20;
    if(turn[head-1]==0){
        turn[head]=0;

当“head”达到“20”时,您可能会遇到问题。然后“head”的值回滚到0,这会导致您测试“turn [-1]”的值。