C ++以两种不同的方式初始化指针会产生两个答案

时间:2014-06-04 21:28:53

标签: c++ c pointers initialization

我确定之前可能已经提出过这个问题,但我找不到任何相关内容。我正在编写一个C ++程序,它调用一个C函数,它需要一个指针作为其中一个输入。然后它将进行一些计算并通过同一指针输出一个数组。我所拥有的一个例子如下。

double foo_init;
double *outarray =&foo_init;

cfunction(outarray);

这可以按照您的预期工作,并且outarray的输出是正确的。

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

double *outarray= new double;

我确定我在这里遗漏了一些东西,但我认为这两个作业是相同的,但很明显有些不同。那是怎么回事?

谢谢, 卡梅伦

3 个答案:

答案 0 :(得分:2)

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

当您的代码具有未定义的行为时,编译器可以随心所欲地执行任何操作,从崩溃您的程序到静默返回错误结果以唤起鼻子恶魔破坏宇宙。你的第一个案子完全“偶然”工作了。

答案 1 :(得分:1)

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

第一个案例已修复:double arr[256]; double *p = arr;(您可以直接将arr传递给函数而不创建p

第二个案例已修复:double *p = new double[256];

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

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

答案 2 :(得分:1)

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

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

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