【问题标题】:Confusing declaration and initializer令人困惑的声明和初始化程序
【发布时间】:2017-11-12 13:00:16
【问题描述】:

这个声明很混乱:

char* q {new char[1024]{}}; // q[i] becomes 0 for all

这是“指向char 数组的指针”还是“char 指针数组”?

我认为 new char[1024]{} 正在初始化一个由 1024 个元素组成的 char 数组,每个元素的值都为 0

所以这与:

char* q = [0,0,....] // until 1024

正确吗?

【问题讨论】:

  • char *q 是指向char 的指针。

标签: c++ pointers initializer-list


【解决方案1】:
char* q {new char[1024]{}};

等于

char* q = new char[1024]{};

这又等于

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }

【讨论】:

    【解决方案2】:

    q 是指向char 的指针。换句话说,它的类型是char *

    它使用表达式new char[1024]{} 进行初始化,该表达式动态分配char 的数组并将它们初始化为零。如果失败,将抛出异常。

    q 将指向动态分配数组中的第一个char。它不是一个数组。

    不一样

    char* q = [0,0,....] // 直到 1024

    因为那是无效的语法。它也不等同于

    char* q = {0,0,....}; //  1024 zeros in initialiser
    

    因为q 是一个指针,不能初始化为一组值。它的(净)效应更接近

    char *q = new char[1024];     //  dynamically allocates chars uninitialised here
    std::fill(q, q + 1024, '\0');
    

    除了将字符初始化为零,而不是先未初始化然后用零覆盖(当然,如何初始化字符取决于编译器)。

    【讨论】:

    • 谢谢!很好的解释!我现在明白p 只是指向第一个元素的地址。说 1024 8-bit pieces of memory (不确定术语是否正确)已在堆上保留并已初始化为 0 是否正确?
    • @SamHammamy(过分)正确的说法是“已使用 operator new 分配了大小至少为 1024 个可寻址内存单元的内存”。 at least 因为编译器可能会为数组分配更多内存,addressable memory units 因为char 定义了最小的可寻址内存单元,并且以位为单位计数是次要的。 operator new 因为堆没有被标准识别。在普通机器上,这和你说的一样
    • @SamHammamy - 我不会说那是完全正确的。 new 表达式动态分配大小等于1024 的内存(更严格地说是1024 乘以char 的大小,但标准将sizeof(char) 定义为1)。正如 WorldSEnder 所指出的,实现可能会分配更多(例如,向上舍入到与系统相关的“块大小”的倍数),但您的程序不能依赖它。 “堆”是/曾经是某些(旧)系统的内存管理的实现细节,并不反映标准要求或其他系统所做的事情。最后,char 可能超过 8 位。
    猜你喜欢
    • 2018-04-25
    • 2021-10-26
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2021-06-13
    • 2021-04-23
    • 2019-12-23
    • 2019-09-27
    相关资源
    最近更新 更多