原帖看此:http://topic.csdn.net/u/20101127/13/a5b7798f-2763-4124-bc90-09117bd418c0.html?864120222
Release下生成的程序会有问题,Debug没有问题。
问题出在free函数上,会导致程序崩溃。
事实上,只只有在函数外申请了至少1个全局变量的空间,就不会出问题了。
这到底是为什么?痛苦。
全项目SVN地址:https://newsnake.svn.sourceforge.net/svnroot/newsnake
根据schlafenhamster大哥提出的想法,改成的函数如下,有同样的问题。求解答。
void LoadMap(HWND hWnd,int iLevel)
{
        char szFileName[50];
        wsprintf(szFileName,"MAP\\level%d.map",iLevel);
        if (mMap.MapElement!=NULL)
        {
                free(mMap.MapElement);
                mMap.MapElement=NULL;
        }
        FILE * fpMapFile=fopen(szFileName,"rb");        if (fpMapFile==NULL)
        {
                MessageBox(hWnd,"地图读取失败!文件未找到!\n游戏退出!","错误",MB_NOFOCUS);
                PostQuitMessage(0);
        }
        int j;
        //char ReadBuffer[2000];
//memset(ReadBuffer,0,sizeof(ReadBuffer));
        fseek(fpMapFile,0,2);
j=ftell(fpMapFile); mMap.iNumber=j/3;
        mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+10));
if (mMap.MapElement==NULL)
        {
MessageBox(hWnd,"内存分配失败!地图读取失败!\n游戏退出","错误",MB_NOFOCUS);
PostQuitMessage(2);
        }
fseek(fpMapFile,0,0);
int x=0;
        while(!feof(fpMapFile))
        {
                fread(&mMap.MapElement[x].vx,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x].vy,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x++].iStyle,sizeof(char),1,fpMapFile);
        }        fclose(fpMapFile);
//         mMap.iNumber=j/3;
// 
//         mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+1));
       //         for (int k=0,x=0; k<j; x++)
//         {
//                 mMap.MapElement[x].vx=ReadBuffer[k++];
//                 mMap.MapElement[x].vy=ReadBuffer[k++];
//                 mMap.MapElement[x].iStyle=ReadBuffer[k++];
//         }}目前得到的解决办法为,在函数外定义任意全局变量。只求原因。

解决方案 »

  1.   

    mMap是结构体?
    MapElement
    stMapElement
      

  2.   

    是的 结构体变量。typedef struct//地图障碍结构
    {
            char vx,vy,iStyle;
    } stMapElement;typedef struct tagMap //地图元素顺序表结构
    {
            stMapElement *MapElement;
            int iNumber;
    } stMap;stMap mMap;
      

  3.   

    错误位置:level.cpp
    函数:void InitLevel(HWND hwnd,int iLevel)将格式化输入语句       fscanf(fp,"%d,%d\n%d\n%d\n%d\n%d\n%d",&lLevel.iInitX,&lLevel.iInitY,&lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,&lLevel.iFoodVariety,&lLevel.iItemVariety);
    更改为
    fscanf(fp,"%d,%d\n%d\n%d\n%d\n%c\n%c",&lLevel.iInitX,&lLevel.iInitY,&lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,&lLevel.iFoodVariety,&lLevel.iItemVariety);
      

  4.   

    上面格式不好,重发下//fscanf(fp,"%d,%d\n%d\n%d\n%d\n%d\n%d",
    // &lLevel.iInitX,&lLevel.iInitY,
    // &lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,
    // &lLevel.iFoodVariety,&lLevel.iItemVariety);
    fscanf(fp,"%d,%d\n%d\n%d\n%d\n%c\n%c", //%c
    &lLevel.iInitX,&lLevel.iInitY,
    &lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,
    &lLevel.iFoodVariety,&lLevel.iItemVariety); //char使用"%d,%d\n%d\n%d\n%d\n%d\n%d"格式化字符串将导致stMapElement *MapElement的值被改写,更改发生在低字节,使得低字节被置0。 我这里测试的结果就是 0xXXXXXX28 变成了 0xXXXXXX00
      

  5.   

    恩 谢谢二位了~
    主要还是 感谢schlafenhamster!感谢你一直关注我的帖子 最终帮我解决问题!