char **test()
{
char *a[3];
a[0] = (char *) malloc(sizeof(char) *3);
a[1] = (char *) malloc(sizeof(char) *3);
a[0] = "aa";
a[1] = "bb";
return a;
}
//main
try{
char ** a;
a = test();
cout << a[0] << " " << a[1];
}
catch(std::exception){}在vs2008中编译,这个程序无法输出" bb“,但在我删除try catch块后,它变成了"aa bb”,这是真的。原因和解决方案?
发布于 2013-03-02 01:31:14
此程序具有未定义的行为,因为您返回的是指向本地的指针。为了解决这个问题,您需要使用malloc分配a数组:
char **test() {
char **a = (char**)malloc(sizeof(char*) * 2);
a[0] = (char *) malloc(sizeof(char) *3);
a[1] = (char *) malloc(sizeof(char) *3);
strcpy(a[0], "aa");
strcpy(a[1], "bb");
return a;
}当然,现在您要完全负责释放main中的所有malloc-ed内存,以避免内存泄漏(您的实现已经为此承担了责任;现在您只需将第三个free添加到调用方)。
您看到的差异很可能是由于使用和不使用try/catch块的堆栈管理的差异造成的。在没有try/catch的情况下,本地的数据仍然可以打印,即使在test()函数返回后引用它不再合法。
发布于 2013-03-02 01:41:04
问题1:返回指向本地数组的指针。当函数返回时,它会被销毁,在此之后使用指针会产生未定义的行为。
问题2:显式内存管理,并用指向字符串文字的指针覆盖指向已分配内存的指针。您分配的内存是泄漏的;如果您试图修改文字,您将得到更多未定义的行为。
假设你写的是C++,而不是C,下面的代码可以解决这两个问题:
std::vector<std::string> test() {return {"aa", "bb"};}https://stackoverflow.com/questions/15163393
复制相似问题