【问题标题】:How to initialize the dynamic array of chars with a string literal in C++?如何在 C++ 中使用字符串文字初始化字符的动态数组?
【发布时间】:2015-02-26 17:55:26
【问题描述】:

我想做以下事情:

std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };

显然,它不起作用,因为我没有指定新数组的大小。什么是在不计算字符串文字中的符号的情况下实现我的目标的合适方法?

也欢迎使用std::array

更新#1:即使我输入了数组的大小,它也不起作用。

更新#2:以简单的char* 指针的形式对数组进行非常量访问至关重要。

【问题讨论】:

  • 一个动态的字符数组,所以你的意思是string - 它也提供了正确的构造函数。如果sizeof("/tmp/lala") 是一个常量,那么sizeof("/tmp/lala") 将适用于该大小(这也包括\0,但要小心)。

标签: c++ arrays c++11 dynamic-arrays syntactic-sugar


【解决方案1】:

这是基于std::array的解决方案:

std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };

您可以使用宏来减少样板:

#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");

sizeof 在编译时进行评估,因此不会在运行时扫描文字字符串来查找其长度。生成的数组以空值结尾,无论如何您都可能想要它。

【讨论】:

    【解决方案2】:

    由于您请求了一个动态数组并且不想计算长度,因此排除了std::array&lt;char,N&gt;。您所要求的实际上只是std::string - 它是动态的(如果需要的话),并且从char* 初始化就好了,而不计算长度。在内部,它将字符串存储在一个平面数组中,因此您可以通过c_str() 调用来使用它。

    【讨论】:

    • 我不想要string,因为数组将作为非常量 char*mkstemp()
    • 完全正确,但是使用文字字符串初始化string 对象,然后调用c_str 以检索char 数组的小示例将使这个答案更好。
    • 啊,你没有具体说明整个问题!由于mkstemp() 修改了它的参数,你说得对,我们需要非常量内存。两个选项:const_cast&lt;char*&gt;(str.c_str()) ... 这很糟糕,但这是你的字符串,mkstemp() 不会改变长度,所以可能没问题。或者您需要计算字符数并使用std::array。或者你可以这样做:char* buf = new char[strlen(template)]; copy(template.begin(),template.end(),buf.begin());
    • @JHUmphrey 放弃 const 是不是的选项。据我所知,这不仅很糟糕,而且只是非法的(表现出未定义的行为)。
    • @Voo:这可能很糟糕,但只有str.c_str() != &amp;str[0]才是非法的,否则原始存储保证是可变的,因此const可以合法地丢弃。
    【解决方案3】:

    我不明白你为什么不使用std::string;你可以使用str.empty() ? NULL : &amp;str[0] 来获得一个非常量指针,所以str.c_str() 的常量性不会造成问题。

    但是,请注意,这不是以 null 结尾的。

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 2017-04-10
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 2013-04-29
      • 2014-10-16
      相关资源
      最近更新 更多