在执行期间随机更改的数组值

时间:2011-10-14 23:29:53

标签: c arrays

我正在尝试使用SDL在C中制作一个小程序,显示一个在网格上移动的机器人。此网格由ts文件0s和1s表示。

这是从txt文件创建数组的功能,它可以工作。

// create a map(array) from a text file
int (*newMap())[SIZE_HEIGHT][SIZE_WIDTH]
{
static const char filename[] = "input.txt";  /* the name of a file to open */
FILE *file = fopen(filename, "r");  /* try to open the file */
int map[SIZE_HEIGHT][SIZE_WIDTH];

char line[BUFSIZ]; /* space to read a line into */
int k = 0;
while ( fgets(line, sizeof line, file)!=NULL && k<SIZE_HEIGHT) /* read each line */
{
    int i;
    char *token = line; /* point to the beginning of the line */

    for ( i = 0; i<SIZE_WIDTH; i++ )
    {
        map[k][i]=((int)*token)-48;
        token+=sizeof(char);
        printf("map[%d][%d]=%d\n", (int)k,(int)i,map[k][i]);
    }
    puts("----\n");
    k++;
}
fclose(file);

int (*p)[SIZE_HEIGHT][SIZE_WIDTH];
p=&map;
return p;

}

然后我尝试将网格放在屏幕上(不是整个功能):

#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <time.h>
#include <string.h>
#include "Parameters.h"
#include "simulation.h"
#include "editor.h"

void simulate(SDL_Surface *ecran)
{
SDL_Surface *carreVert = SDL_LoadBMP("carreVert.bmp");
SDL_Surface *carreRouge = SDL_LoadBMP("carreRouge.bmp");
SDL_Surface *robot = SDL_LoadBMP("robotRouge.bmp");

SDL_SetColorKey(robot, SDL_SRCCOLORKEY, SDL_MapRGB(robot->format, 255, 255, 255));

int (*map)[SIZE_HEIGHT][SIZE_WIDTH];
 map=newMap();
SDL_Rect positionFond;

int i;
int j;

for(j=0; j<SIZE_HEIGHT; j++)
{
    for(i=0; i<SIZE_WIDTH; i++)

    {


        positionFond.x = 100*i;
        positionFond.y = 100*j;
        if((*map)[j][i]+1)
        {

            SDL_BlitSurface(carreVert, NULL, ecran, &positionFond);
        }else
        {


            SDL_BlitSurface(carreRouge, NULL, ecran, &positionFond);
        }

    }

}

然后发生了一些奇怪的事情:当我用调试器观察数组*映射时,我发现当我进行测试时值会发生变化。所以网格确实出现了,但没有正确的模式。为什么会这样?

编辑:编译器没有错误。

编辑:任何可以做到这一点的猜测都会很乐意接受。

2 个答案:

答案 0 :(得分:2)

数组map是函数的本地。当函数完成时它就不复存在了。您将其地址传递给调用者,但是当调用者尝试使用它时... BANG!

快速解决方案:将数组map设为static一个:确保每次运行时不要多次调用newMap

其他解决方案:

  • 向外移动数组的创建并传递
  • 的地址
  • 使用malloc和朋友来管理数组

答案 1 :(得分:1)

您正在返回一个指向具有自动存储持续时间的对象的指针(一个从声明它的函数返回时被“解除分配”的数组),因此您最终会看到随机垃圾。