【问题标题】:Initializing to a dynamically allocated const char array from a const char array从 const char 数组初始化为动态分配的 const char 数组
【发布时间】:2017-02-01 14:00:38
【问题描述】:

我正在尝试编写将 const char 数组分配给动态分配的 const char 数组的代码。 我试着这样做

const char staticArray[4] = "abc";
const char * ptrDynamicArray;
ptrDynamicArray = new const char[4](staticArray);

但我收到一个错误(“数组新 [-fpermissive] 中的带括号的初始化程序”)。

我有两个问题:

  1. 我该如何解决 - 比如关闭它(我使用的是 Code::Blocks 16.01)?

  2. 我能否以其他方式初始化动态分配的 const char 数组?

【问题讨论】:

  • 首先,更喜欢使用std::string。要复制 C 风格的字符串,您需要 strcpy 或类似例程的服务。您的表达式new const char[4](staticArray); 尝试用staticArray 构造新创建的数组中的每个元素。并且不能使用 char[4] 类型构造 char 类型
  • 数组应该是字符串吗?那为什么不用std::string呢?
  • 最后我需要一个 const char* 来传递给 fstream
  • 确实知道流可以处理std::string<< 的重载采用 std::string 参数。如果你使用例如readwrite 读取或写入原始数据,然后您可以轻松获取指向字符串对象中包含的数据的指针。这似乎是an XY problem,您可以在其中向我们寻求帮助以解决您未告诉我们的问题。

标签: c++ arrays dynamic codeblocks


【解决方案1】:

重载新的操作符会完成你的工作。

void * operator new[](size_t n, const char *s) {
    void *p = malloc(n);
    strcpy((char *)p, s);
    return p;
}

现在可以像这样调用 new 运算符:

const char staticArray[4] = "abc";
const char * ptrDynamicArray;
ptrDynamicArray = new (staticArray) char[4];

【讨论】:

    【解决方案2】:

    您不能直接从另一个数组复制初始化一个数组,因此会出现错误。您要么需要手动复制元素(或使用std::copy),或者更好的是,如果您想要一个“可复制”的数组,请改用std::array<char, 4>

    但是,正如 cmets 中所提到的,最好的可能是在此处使用 std::string,并使用其 std::string::c_str() 成员函数,以防您需要将 const char* 指针传递给类似 C 的旧接口。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2016-11-21
      • 2014-07-17
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多