首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >try catch对char**返回值有影响

try catch对char**返回值有影响
EN

Stack Overflow用户
提问于 2013-03-02 01:26:30
回答 2查看 339关注 0票数 1
代码语言:javascript
运行
复制
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”,这是真的。原因和解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 01:31:14

此程序具有未定义的行为,因为您返回的是指向本地的指针。为了解决这个问题,您需要使用malloc分配a数组:

代码语言:javascript
运行
复制
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()函数返回后引用它不再合法。

票数 3
EN

Stack Overflow用户

发布于 2013-03-02 01:41:04

问题1:返回指向本地数组的指针。当函数返回时,它会被销毁,在此之后使用指针会产生未定义的行为。

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

假设你写的是C++,而不是C,下面的代码可以解决这两个问题:

代码语言:javascript
运行
复制
std::vector<std::string> test() {return {"aa", "bb"};}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15163393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档