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

时间:2015-05-13 12:59:20

标签: c++ arrays pointers

我不明白指针如何将char数组或字符串赋值为:

char* Carr = new char[5];
Carr = "Hello";

然而,下面的代码不起作用:

int* Iarr = new int[5];
Iarr = { 1,2,3,4 };

我知道指针可以赋值而不是值,所以编译器如何接受字符串?

4 个答案:

答案 0 :(得分:5)

第一个没有分配给数组。它更改指针,使其指向由字符串文字定义的静态数组,而不是您分配的动态数组。动态数组现在泄露,无法访问它。在现代C ++中,这不应该编译,因为文字是常量,所以只有const char *可以指向它。

第二个不起作用,因为与字符串文字不同,支撑列表不会创建数组或可以指定给指针的任何其他内容。

如果您需要可指定的数组,请使用std::arraystd::stringstd::vector

答案 1 :(得分:1)

使用时

Carr = "Hello";

使用char分配new指针后,您将丢失对已分配内存的引用(导致内存泄漏),并使Carr点为"Hello"点字符串文字Iarr = { 1,2,3,4 };

下面,

int*

您将 <from uri="amq:example.MyQueue" /> 分配给初始化列表(这没有任何意义)。这就是编译器在您尝试执行此操作时抱怨的原因。

答案 2 :(得分:1)

字符串文字(即用双引号括起来的字符序列)是一种特殊情况。 C ++编译器具有特殊代码,可将其内容放在代码内的指定区域,并将程序指向它。字符串文字也恰好与const字符指针兼容,因此您可以进行分配(您应该收到警告或错误,因为Carr不是const)。

整数数组没有这样的处理。虽然您可以为它们提供初始值设定项,但您无法以与制作字符聚合的方式相同的方式对它们进行聚合。将它们放在双引号中:编译器不支持它。

幸运的是,大多数情况下您不必执行任何操作,因为C ++标准库为数组和字符串提供了更好的替代方案。例如,您可以像这样重写Iarr初始化:

auto Iarr = vector<int> {1, 2, 3, 4, 5};

答案 3 :(得分:0)

第一个和第二个代码段在C ++中都不是有效的(2011年之后)。

在C ++ 11标准C ++支持之前,但自1998年第一个C ++标准以来,已弃用,将字符串文字隐式转换为指向非const项的指针,产生指向第一个角色的指针。

因为那很危险,所以它被删除了。

第一个示例的更正版本:

char const* Carr = new char[5];
Carr = "Hello";

此处Carr的赋值不分配数组,而是指向数组中第一项的指针。

它调用从数组到指向第一项的指针的隐式转换,称为类型衰减。函数指针有一个相应的衰减(隐式转换)。

编译器可能仍然作为兼容性功能,或者仅仅因为它们尚未修复,支持从字符串文字转换为非const指针。您可以找到一些选项来为您的特定编译器关闭它,或者至少产生警告。