简单的测试程序,那位老大帮调试一下,怎么老是出错
#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;
}