用两种不同的方式初始化指针会得到两种结果

C++ Initializing pointer two different ways results in two answers

本文关键字:两种 结果 指针 方式 初始化      更新时间:2023-10-16

我相信以前可能有人问过这个问题,但是我找不到关于这个的任何东西。我正在写一个c++程序,调用一个C函数,需要作为它的输入之一的指针。然后它会做一些计算,并通过这个指针输出一个数组。下面是我所拥有的一个例子。

double foo_init;
double *outarray =&foo_init;
cfunction(outarray);

这就像你期望的那样工作,outarray的输出是正确的。

然而,如果我以另一种方式初始化,我只得到2个实值,数组的其余部分实际上是零(6.9e-310)。

double *outarray= new double;

我确定我在这里遗漏了一些东西,但我的印象是这两个任务是等效的,但很明显有些不同。那么到底是怎么回事呢?

谢谢,卡梅伦

两种情况都有未定义的行为。您为单个double分配了空间,在第一种情况下作为堆栈上的自动变量,或者在第二种情况下作为new在堆上,但是您的函数写入了多个double

当你的代码有未定义的行为时,编译器可以做任何它喜欢做的事情,从崩溃你的程序到无声地返回错误的结果,从召唤鼻子恶魔到毁灭宇宙。你的第一个案例"成功"完全是偶然的。

你误解了指针。在这两种情况下,你都没有足够的内存来存储你的数组。如果指针指向单个数字,则只能修改该数字。

第一种情况固定:double arr[256]; double *p = arr;(您可以将arr直接传递到函数而无需创建p)

第二行:double *p = new double[256];

当然,你可以用任何你需要的数字来代替256。

如果您当前的示例现在正在工作,它们有时仍然会导致崩溃。

单个变量,如foo_init,类似于包含一个元素的数组。

两个赋值是等价的,它们都将outarray设置为指向包含一个double类型的数组。唯一的区别是,在第一种情况下,数组在堆栈上,在第二种情况下,数组在堆上。同样,在第一种情况下,当包含此代码的函数返回时,数组将自动释放,而在第二种情况下,您必须使用delete显式释放内存。

如果cfunction()试图访问数组的第一个元素以上,则在两种情况下都调用未定义行为。在某些情况下,您可能不会立即得到错误,但这只是运气。