繁体   English   中英

初始化一个指向char数组的指针

[英]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::arraystd::stringstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM