用两种不同的方式初始化指针会得到两种结果
C++ Initializing pointer two different ways results in two answers
我相信以前可能有人问过这个问题,但是我找不到关于这个的任何东西。我正在写一个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()
试图访问数组的第一个元素以上,则在两种情况下都调用未定义行为。在某些情况下,您可能不会立即得到错误,但这只是运气。
- 在C++中将函数压缩为两种方式
- 如何使映射键具有两种不同的数据类型?
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 如何构造可以调用和返回两种不同类型的模板
- 这两种C++语法之间有什么区别?
- 为什么两种不同的对象初始化方式给出不同的输出
- std::cin 从控制台获取两种不同的变量类型,'storing'以后使用第二种类型?
- 定义类模板构造函数的两种方法之间的区别
- 初始化类的两种方法?
- C++ 一个函数,可以根据接受的值返回两种类型之一
- 如何检查程序员在C++中提供的两种不同格式的输入
- C++指针中的这两种类型的值分配有什么区别?
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 如何获得将两种不同类型的相乘的结果类型?
- 使用两种不同的方法遍历 Vector 的结果不一致
- C++ 尝试将数字右移 32 会得到两种不同的结果
- 如何根据两种输入状态编写输出结果
- 用两种不同的方式初始化指针会得到两种结果
- CreateCompatibleDC的结果只有两种颜色