从 const char 数组初始化为动态分配的 const char 数组

Posted

技术标签:

【中文标题】从 const char 数组初始化为动态分配的 const char 数组【英文标题】:Initializing to a dynamically allocated const char array from a const char array 【发布时间】: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] 中的带括号的初始化程序”)。

我有两个问题:

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

    我能否以其他方式初始化动态分配的 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,您可以在其中向我们寻求帮助以解决您未告诉我们的问题。 【参考方案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 的旧接口。

【讨论】:

以上是关于从 const char 数组初始化为动态分配的 const char 数组的主要内容,如果未能解决你的问题,请参考以下文章

初始化静态 const char* 数组

C ++ - Char数组以某种方式初始化为错误的大小

将 const char[] 初始化为非静态类成员

初始化动态分配数组

C中堆栈上的动态数组分配

具有 char 数组的 C++ 结构以不寻常的方式初始化为零