C++如何在初始化列表中将指针数组设置为null?

use*_*320 27 c++ arrays null pointers

我知道你不能使用数组的初始化列表.但是我听说过你可以用类似于初始化列表的方式设置指向NULL的指针的方法.

我不确定这是怎么做到的.我听说默认情况下指针设置为NULL,但我不知道这是否在C++标准中得到保证.我也不确定与正常分配相比,通过新运算符初始化是否也会产生影响.

编辑:我的意思是在头文件/构造函数初始化列表中执行此操作.我不想把它放在构造函数中,我也不想使用Vector.

AnT*_*AnT 40

要在构造函数初始值设定项列表中设置指向空值的指针数组,可以使用()初始值设定项

struct S {
  int *a[100];

  S() : a() {
    // `a` contains null pointers 
  }
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,在当前版本的语言中,()初始化程序是唯一可以与构造函数初始化程序列表中的数组成员一起使用的初始化程序.但显然这就是你需要的东西.

()对与分配的数组一样的效果new[]

int **a = new int*[100]();
// `a[i]` contains null pointers 
Run Code Online (Sandbox Code Playgroud)

在其他上下文中,您可以使用{}聚合初始值设定项来实现相同的效果

int *a[100] = {};
// `a` contains null pointers 
Run Code Online (Sandbox Code Playgroud)

请注意,绝对不需要挤压一个0NULL两个之间{}.空的一对{}会很好.

  • +1 - 除此之外,C要求初始化器括号之间至少有一个值.C++添加了空括号初始值设定项(`{}`),因为没有理由说对象的默认值必须是类似于'0'的东西,并且要求初始化对象的代码可能不知道什么是合理的默认值(特别是在模板中). (6认同)
  • 我认为`int*a = new int [100]();`创建一个指向一个整数数组的指针,该数组初始化为零,意味着`a [i]`将包含0并且是一个指向(i + 1)的解引用指针该数组中的整数而不是空指针. (2认同)

Pau*_*l R 7

通常,默认情况下不会初始化数组,但是如果您显式初始化一个或多个元素,则任何剩余元素都将自动初始化为 0。由于 0NULL是等效的,因此您可以NULL像这样初始化指针数组:

float * foo[42] = { NULL }; // init array of pointers to NULL
Run Code Online (Sandbox Code Playgroud)

  • @amfcosta:我不确定为什么你认为答案不清楚,或者为什么它值得投反对票?OP 询问如何初始化指向“NULL”的指针数组。 (2认同)

Vla*_*lad 6

您可以从数组切换到std::vector使用

std::vector<T*> v(SIZE);
Run Code Online (Sandbox Code Playgroud)

值将NULL自动初始化为s.这是首选的C++方式.


更新:从C++ 11开始,还有一种方法:使用

std::array<T*, SIZE> array = {};
Run Code Online (Sandbox Code Playgroud)

这更像是C样式数组的更正版本(特别是避免动态分配),它的大小包含并且不会衰减到指针.但是,需要在编译时知道大小.

  • 如果在编译时已知大小,则内置数组更好.尽可能避免动态分配.只要在编译时不知道大小常量,就应该使用`vectors`. (3认同)
  • @Billy向量比数组有许多优点,它们与动态分配无关.例如,向量随身携带它们的大小并且不会衰减成指针.一个人应该避免动态分配 - 但是在一个人自己的代码中,而不是在库代码中. (2认同)