首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

简单的测试程序,那位老大帮调试一下,如何老是出错

2012-03-03 
简单的测试程序,那位老大帮调试一下,怎么老是出错 #includewindows.h#includestdio.h#includeiostrea

简单的测试程序,那位老大帮调试一下,怎么老是出错

#include   <windows.h>
#include   <stdio.h>
#include   <iostream.h>

struct   abc
{
        char   acd[256];
};

int   main(int   argc,   char*   argv[])
{
       
        LPSTR*   iA;

        iA   =   testFun();

        for   (int   i   =   0;   i <10;   i++)
        {
                cout   < <*(iA+i-1) < <endl;   //此处无法打印出正确的字符串
        }

        free(iA);

        getchar();
        return   0;
}

LPSTR*   testFun()
{
        LPSTR*   iA;
        LPSTR*   iB;

        iA   =   (LPSTR*)calloc(10,sizeof(LPSTR));

        abc   xxx;
        strcpy(xxx.acd, "abd ");

        for   (int   i   =   0;   i <10;   i++)
        {
                *(iA+i-1)   =   xxx.acd;
                cout   < <*(iA+i-1) < <endl;
        }

        iB=iA;

        iA=NULL;   //去掉这一行就会出现释放无效内存的错误,则么会事情
        free(iA);    
       
        return   iB;
}

[解决办法]
LPSTR* testFun()
{
LPSTR* iA;
LPSTR* iB;

iA = (LPSTR*)calloc(10,sizeof(LPSTR));

abc xxx;
strcpy(xxx.acd, "abd ");

for (int i = 0; i <10; i++)
{
*(iA+i-1) = xxx.acd;
cout < <*(iA+i-1) < <endl;
}

iB=iA;

iA=NULL; //去掉这一行就会出现释放无效内存的错误,则么会事情
//如果你不去掉这一行,下面的free(iA)实际就是free(NULL),等于没有作用。
//如果你去掉早面那一行,下面的free语句就已经把上面你用malloc分配的空间释放掉了,而你返回的 iB就是iA,也就是你分配的空间的首地址,这个地址出函数后被你赋给了main中的iA,后面再用free(iA)释放——也就是说,你释放了一个已经释放了空间,当然会出错了。
free(iA);

return iB;
}

[解决办法]
LPSTR* testFun()
{
LPSTR* iA;
iA = (LPSTR*)calloc(10,sizeof(LPSTR));

abc xxx;//最大的错误在这里.xxx是局部变量,函数结束,对象销毁.
strcpy(xxx.acd, "abd ");

for (int i = 0; i <10; i++)
{
*(iA+i) = xxx.acd;//所以这里赋的指针,出了函数是无效的.
//注意,iA是指针的指针,*(iA+i)是一个串指针.
cout < <*(iA+i) < <endl;
}

return iA;
}

热点排行
Bad Request.