Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++初始化指针两种不同的方式得到两个答案_C++_C_Pointers_Initialization - Fatal编程技术网

C++初始化指针两种不同的方式得到两个答案

C++初始化指针两种不同的方式得到两个答案,c++,c,pointers,initialization,C++,C,Pointers,Initialization,我敢肯定这可能已经被问过了,但我找不到任何关于这个的东西。我正在编写一个C++程序,调用一个C函数,它需要作为指针的输入之一。然后它将进行一些计算,并通过这个指针输出一个数组。下面是我的一个例子 double foo_init; double *outarray =&foo_init; cfunction(outarray); 这正如您所期望的那样工作,outarray的输出是正确的 然而,如果我用另一种方式初始化,我只得到2个实数,数组的其余部分实际上是0 6.9e-310 dou

我敢肯定这可能已经被问过了,但我找不到任何关于这个的东西。我正在编写一个C++程序,调用一个C函数,它需要作为指针的输入之一。然后它将进行一些计算,并通过这个指针输出一个数组。下面是我的一个例子

double foo_init;
double *outarray =&foo_init;

cfunction(outarray);
这正如您所期望的那样工作,outarray的输出是正确的

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

double *outarray= new double;
我确信我在这里遗漏了一些东西,但我的印象是这两个任务是相同的,但很明显有些东西是不同的。那么到底发生了什么

谢谢,
卡梅隆

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

第一种情况已修复:双arr[256];双*p=arr;您可以直接将arr传递到函数中,而无需创建p

第二种情况已修复:double*p=新的double[256]

当然,您可以用所需的任何数字替换256


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

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

当您的代码有未定义的行为时,编译器可以随心所欲地执行任何操作,从崩溃程序到默默返回错误结果,再到变出鼻魔,再到毁灭宇宙。您的第一个案例完全是偶然发生的。

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

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


如果cffunction尝试访问数组的多个元素,则在这两种情况下都会调用未定义的行为。在某些情况下,您可能不会立即出现错误,但这只是幸运而已。

哪个阵列?此代码中没有任何数组。new double分配单个double。使用运算符new[]分配数组通常当您得到无法解释的结果时,这意味着您有未定义的行为,因为您做错了什么。这看起来很有可能。您很幸运,您的第一个版本可以正常工作。第二个版本暴露了您没有分配正确的类型double[],您说您缺少了一些东西。这里面有很多;我们也是。比如cfunction的定义,以及你至少希望它能做什么的描述。谢谢。我现在明白了,我必须初始化尽可能多的空间,因为我期望函数使用。所以我应该事先知道预期的输出数组有多大?@Cameron如果你使用的是一些蹩脚的函数,它们接受一个指针,并期望它具有一定的大小,那么是的。这现在就有意义了。我对初始化指向数组的指针感到困惑。@DOUGLASO.MOEN当然。但是我调用的C函数将这个变量作为数组输出,所以为了方便起见,我用这种方式命名它。无论如何,谢谢你的评论。我想我现在终于掌握了指针。