【问题标题】:Returning a char array instead of const char *返回一个 char 数组而不是 const char *
【发布时间】:2014-02-19 08:44:21
【问题描述】:

如何从返回类型为 const char* 的函数返回本地字符数组?
注意:我想要一种不使用 std 的方法: :字符串

const char * getXXX()
{
  char buf[32];
  sprintf(buf,"XXX%d",i);  // some manipulation
  return buf; // How to return???
}

【问题讨论】:

  • @Spook ,如果我在函数内使用“new”关键字,我应该在哪里删除该指针?
  • 您能否详细说明为什么您不想使用std::string?使用standard library 将使您作为 C++ 程序员的生活变得更加轻松!
  • @Nadaraj 我已经回答过 :) 如果您在函数内部分配内存,则调用者负责释放它。当然,除非您使用 std::string - 那么您可以简单地按值返回它,而不必担心释放分配的内存。
  • @Joachim Pileborg .. 因为我在函数中使用了很多 sprintf 语句,所以我需要一个 char buf。所以,我正在寻找一个解决方案,而不是再次将 char buf 分配给临时字符串以返回值。
  • 你知道std::ostringstream吗?使用它,您可以使用所有正常的 C++ 流输出格式化功能,并且仍然可以得到 std::string 作为输出。没有固定大小的缓冲区,没有对字符串的特殊情况处理,类型安全,自动附加到字符串。所有这些你无法通过使用旧的 C 风格 sprintf 和家庭获得的东西。

标签: c++


【解决方案1】:
const char * getXXX()
{
  static char buf[32];
  sprintf(buf,"XXX%d",i);
  return buf;
}

这会起作用

【讨论】:

    【解决方案2】:

    正如您正确注意到的,您不应该返回 buf(这是一个局部变量,它的内存将在函数返回后被释放)。解决方法是分配一些内存并返回。

    char * returnBuf = new char[32];
    
    memcpy(returnBuf, buf, 32 * sizeof(char));
    
    return returnBuf;
    

    但请记住,调用者将负责释放 getXXX 返回的内存:

    char * result = GetXXX();
    
    // Process
    
    delete[] result;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多