我确定之前可能已经提出过这个问题,但我找不到任何相关内容。我正在编写一个C ++程序,它调用一个C函数,它需要一个指针作为其中一个输入。然后它将进行一些计算并通过同一指针输出一个数组。我所拥有的一个例子如下。
double foo_init;
double *outarray =&foo_init;
cfunction(outarray);
这可以按照您的预期工作,并且outarray的输出是正确的。
但是,如果我初始化另一种方式,我只得到2个实数值,并且数组的其余部分实际上为零(6.9e-310)。
double *outarray= new double;
我确定我在这里遗漏了一些东西,但我认为这两个作业是相同的,但很明显有些不同。那是怎么回事?
谢谢, 卡梅伦
答案 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()
尝试访问多于数组的第一个元素,则在两种情况下都会调用未定义的行为。在某些情况下,你可能不会立即得到错误,但那只是幸运。