[英]initialize a pointer to char array
我不明白指针如何将char数组或字符串分配为:
char* Carr = new char[5];
Carr = "Hello";
但是下面的代码不起作用:
int* Iarr = new int[5];
Iarr = { 1,2,3,4 };
我知道指针可以分配引用而不是值,那么编译器如何接受字符串?
第一个没有分配给数组。 它更改了指针,使其指向由字符串文字定义的静态数组,而不是您分配的动态数组。 现在,动态数组已泄漏,无法访问它。 在现代C ++中,这不应该编译,因为文字是常量,因此只有const char *
可以指向它。
第二个不起作用,因为与字符串文字不同,括号列表不会创建数组或可分配给指针的任何其他内容。
如果要分配数组,请使用std::array
, std::string
或std::vector
。
使用时
Carr = "Hello";
使用new
分配char
指针后,您将丢失对已分配内存的引用(导致内存泄漏 ),并使Carr
指向字符串文字"Hello"
。
这里,
Iarr = { 1,2,3,4 };
您将int*
分配给初始化程序列表(没有任何意义)。 这就是为什么编译器在尝试执行此操作时会抱怨的原因。
字符串文字(即用双引号引起来的字符序列)是一种特殊情况。 C ++编译器具有特殊的代码,这些代码将其内容放在代码内的指定区域中,并向您的程序提供指向它的指针。 字符串文字也恰好与const
字符指针兼容,因此您可以进行赋值(您应该得到警告或错误,因为您的Carr
不是const
)。
对于整数数组没有这种处理。 尽管可以为它们提供初始化程序,但是不能通过将它们放在双引号中来进行与“字符聚合”相同的方式来对它们进行聚合:编译器不提供对它的支持。
幸运的是,大多数时候您不必执行任何操作,因为C ++标准库为数组和字符串提供了更好的替代方法。 例如,您可以这样重写Iarr
初始化:
auto Iarr = vector<int> {1, 2, 3, 4, 5};
第一个代码段和第二个代码段在C ++中均无效(2011年之后)。
在C ++ 11标准支持C ++之前,但自1998年第一个C ++标准以来已弃用 ,字符串文字的隐式转换为指向非const
项的指针,从而产生了指向第一个字符的指针。
由于那很危险,因此将其删除。
您的第一个示例的更正版本:
char const* Carr = new char[5];
Carr = "Hello";
在这里,对Carr
的分配不分配数组,而是指向数组中第一项的指针。
它调用从数组到第一个项目的指针的隐式转换,称为类型衰减 。 函数到函数指针有相应的衰减(隐式转换)。
编译器可能仍会作为兼容性功能,或者仅由于未修复而支持从字符串文字到指针到非const
的转换。 您也许可以找到一些选项来关闭特定编译器的电源,或者至少发出警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.