C++ 如何在C+中使用字符串文本初始化动态字符数组+;?

C++ 如何在C+中使用字符串文本初始化动态字符数组+;?,c++,arrays,c++11,dynamic-arrays,syntactic-sugar,C++,Arrays,C++11,Dynamic Arrays,Syntactic Sugar,我想做以下工作: std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" }; std::unique_ptr buffer=new char[/*…*/]{/tmp/file-XXXXXX}; 显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的合适方法是什么 还欢迎使用std::array 更新#1:即使我设置了数组的大小,它也不会工作 更新

我想做以下工作:

std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };
std::unique_ptr buffer=new char[/*…*/]{/tmp/file-XXXXXX};
显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的合适方法是什么

还欢迎使用
std::array

更新#1:即使我设置了数组的大小,它也不会工作


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

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

我不明白您为什么不使用
std::string
;您可以执行
str.empty()?NULL:&str[0]
获取非常量指针,因此
str.c_str()
的常量不会造成问题


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

这里有一个基于
std::array
的解决方案:

std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };
std::数组arr{”/tmp/file-XXXXXX};
您可以使用宏缩小样板文件:

#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");
#define DECLARE_LITERAL_ARRAY(name,str)std::ARRAY name{str}
声明文字数组(arr,“/tmp/file-XXXXXX”);

sizeof
是在编译时计算的,因此没有运行时扫描文本字符串以查找其长度。结果数组以null结尾,这可能是您无论如何都想要的。

一个动态字符数组,因此您指的是一个
字符串
——它附带提供了正确的构造函数。如果大小是一个常量(也包括
\0
),那么
sizeof(“/tmp/lala”)
将适用于大小。我不想要
string
,因为数组将作为非常量
char*
mkstemp()
完全正确,但是一个小例子,用一个文本字符串初始化一个
string
对象,然后调用
c_str
来检索
char
数组,这个答案会更好。啊,你没有说明整个问题!因为
mkstemp()
修改了它的参数,所以我们需要非常量内存是对的。两个选项:
const\u cast(str.c\u str())
。。。这很糟糕,但它是您的字符串,
mkstemp()
不会更改长度,因此可能没问题。或者您需要计算字符数并使用
std::array
。或者您可以这样做:
char*buf=newchar[strlen(模板)];复制(template.begin(),template.end(),buf.begin())@JHUmphrey将常量丢弃不是一个选项。就我所知,这不仅很糟糕,而且完全是非法的(表现出未定义的行为)。@Voo:可能很糟糕,但只有当
str.c_str()!=&str[0]
,否则原始存储保证是可变的,因此可以合法地丢弃
const