1
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”,这是真的。原因和解决方法?

4

2 回答 2

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-ed 内存main,以避免内存泄漏(你已经在你的实现中陷入困境;现在你只需将第三个添加free到调用者)。

您看到的差异很可能是由于使用和不使用try/catch块的堆栈管理的差异。似乎没有try/本地数据仍然可供您打印,即使在函数catch返回后引用它不再合法。test()

于 2013-03-01T17:31:13.690 回答
0

问题1:返回一个指向本地数组的指针。当函数返回时,这将被销毁,然后使用指针会给出未定义的行为。

问题 2:显式内存管理,并用指向字符串文字的指针覆盖指向已分配内存的指针。你分配的内存泄露了;如果您尝试修改文字,您将获得更多未定义的行为。

假设您正在编写 C++,而不是 C,以下将解决这两个问题:

std::vector<std::string> test() {return {"aa", "bb"};}
于 2013-03-01T17:41:04.137 回答