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中编译,这个程序无法输出&#34; bb&#34;,但在我删除了try catch块之后,结果却是&#34; aa bb&#34;这是真的。原因和解决方案?
答案 0 :(得分:3)
此程序具有未定义的行为,因为您正在返回指向本地的指针。您需要使用a
分配malloc
数组以解决问题:
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;
}
当然,现在你完全有责任释放malloc
中所有main
- 内存,以避免内存泄漏(你已经在实施时已经处于困境;现在你只需要需要将第三个free
添加到调用者。)
您看到的差异很可能是由于使用和不使用try
/ catch
块的堆栈管理的差异。看来如果没有try
/ catch
,本地的数据仍可供您打印,即使在返回test()
函数后引用它也不再合法。< / p>
答案 1 :(得分:0)
问题1:返回指向本地数组的指针。当函数返回时会被破坏,并且在此之后使用指针会产生未定义的行为。
问题2:显式内存管理,并使用指向字符串文字的指针覆盖指向已分配内存的指针。你分配的内存泄露了;如果你试图修改文字,你会得到更多未定义的行为。
假设您正在编写C ++而不是C,以下内容将解决这两个问题:
std::vector<std::string> test() {return {"aa", "bb"};}