从函数返回堆字符指针的问题

Posted

技术标签:

【中文标题】从函数返回堆字符指针的问题【英文标题】:Issue with returning a heap char pointer from a function 【发布时间】:2014-04-25 19:32:21 【问题描述】:

此代码有效:

char* CFichierTrace::ConvertBSTRToString(BSTR* str) 如果(str == NULL) 字符* buf = 新字符[2]; sprintf_s(buf, 2, "%s", ""); 返回缓冲区; 别的 返回 _com_util::ConvertBSTRToString(*str);

但我试图避免多次退货,有人告诉我编程不好。但是它不起作用:

char* CFichierTrace::ConvertBSTRToString(BSTR* str) // char* 结果 = new char[1]; (尝试#1,产生垃圾作为输出) char* 结果 = (char*) malloc(1 *sizeof(char)); (尝试#2,更多垃圾作为输出) 如果(str == NULL) 字符* buf = 新字符[2]; sprintf_s(buf, 2, "%s", ""); 结果 = buf; 别的 结果 = _com_util::ConvertBSTRToString((BSTR) str); 返回结果;

有一篇关于在参数中将字符串作为 char** 返回的文章(通过 ref),但我不明白为什么无法返回堆中的 char* ?

【问题讨论】:

为什么不使用std::string?绝对应该避免在此处使用malloc,并像在第一个示例中那样选择使用new 多次回报是糟糕的编程是一个神话。 多次退货绝对没有错。 我的代码正在运行。我编码((BSTR)str)而不是(*str)。感谢您的快速解答! @RobK:在 C++ 风格的编程中,所有代码都必须能够处理早期返回,特别是通过异常。这意味着多个普通回报是没有问题的。然而,在 C 风格的代码中,多次返回很容易导致清理操作无法正常进行。 【参考方案1】:
   char* CFichierTrace::ConvertBSTRToString(BSTR* str)
   
       char* ret;
       if ( str == NULL )
       
          ret = new char[1];
          ret[0] = 0;
       
       else
          ret =  _com_util::ConvertBSTRToString(*str);

       return ret;
    

顺便说一句,您不应该将 C++ new 与 C malloc 混合使用。 此外,可以说多个返回点是一种不好的做法。当您有多个返回点时,有很多情况下代码更具可读性。

【讨论】:

【参考方案2】:

你会这样做:

    char* CFichierTrace::ConvertBSTRToString(BSTR* str)
    
       char* buf;

       if ( str == NULL )
       
          buf = new char[2];
          sprintf_s(buf, 2, "%s", "");
       
       else
          buf =  _com_util::ConvertBSTRToString(*str);

       return buf;
    

【讨论】:

【参考方案3】:

我只是假设您知道为什么您将指针传递给 BSTR,而不是 BSTR。

char* CFichierTrace::ConvertBSTRToString(BSTR* str) 
    return _com_util::ConvertBSTRToString(*str);

由于BSTR-semantics,这是正确的实现。 澄清一下,所有正确的 BSTR 函数都将 NULL 视为 0 长度的 BSTR

无论如何,只要有意义,就使用多个返回点,除非您的编码标准不正确,不允许这样做。

【讨论】:

+1 迄今为止唯一合理的答案。我认为它已经过测试。

以上是关于从函数返回堆字符指针的问题的主要内容,如果未能解决你的问题,请参考以下文章

C#从返回char指针的c++函数中获取字符串/字符值

C语言中返回字符串函数的四种实现方法

指针函数不可以返回局部变量地址解决

如何从 char* 函数返回指针

C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?