【问题标题】:Initialization of a pointer to an array of int初始化指向 int 数组的指针
【发布时间】:2012-12-19 20:31:55
【问题描述】:

我再次使用 C++ 并注意到在类成员方法或 main() 函数内声明为指针时数组初始化的奇怪行为。

int * p = new int[20];

我期望发生的事情是指针将保持未初始化的随机值,就像它们一样

int arr[20];

但相反,它们都归零。怎么回事?

【问题讨论】:

  • 数组不是指针。指针不是数组。 p 是一个指针,而不是一个数组。此外,p 公然有一个初始化程序。 (但*p 没有。)
  • 顺便说一句:大多数时候,您不应该使用原始指针数组或new [](您通常需要std::vector)。
  • @Cz-David 大多数操作系统会清除分配给您的程序的内存,这样您就无法窥视之前的程序做了什么。这可能是看到很多零的原因。

标签: c++ arrays pointers initialization int


【解决方案1】:

即使它们为零(这很松散,见下文),它们也没有被初始化。

实际上,您无法判断它们是否为零,因为如果您读取这些值,则会遇到未定义的行为。您无法读取未初始化的变量。

要初始化数组值,您可以这样做:

int * p = new int[20]();
//                   ^^
//             note parenthesis

否则没有,它没有被初始化。

【讨论】:

  • 我知道如何初始化一个数组。我只是希望未初始化的数组不为零。我是否认为编译器(g++)将未定义的行为定义为零(我也知道我不应该依赖它)。它的行为不像我预期的那样。
  • @Cz-David:想想动态分配的内存来自哪里,想想操作系统如何分配内存。请记住,一次可能有不止一个人在使用一个操作系统。
  • @Cz-David 不,不要假设任何事情。你也可以在那里没有零。操作系统只是给你内存——如果之前使用过该内存并且它是 0,它不会改变它。如果它为您提供了已使用并设置为其他内容的内存,那将是...
  • @LuchianGrigore:实际上,为您提供完全内存确实的现代操作系统通常出于安全原因将整个页面归零。您不希望自己的数据意外地进入不同的进程空间,对吗?
  • @KerrekSB 好吧,我不会对初学者这么说,以免给人留下他可以依赖这种行为的印象。
【解决方案2】:

p 是一个指向整数的指针,它使用new[] 表达式的结果进行初始化。该表达式返回动态分配的整数数组的第一个元素的地址。数组本身未初始化并且包含不确定的值。如果您说的是new int[100](),则该数组将被初始化为零。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多