我正在尝试将指针数组的每个元素初始化为具有关联值0.0
的double。
我有以下代码:
double* dp[10];
for (int i = 0; i < 10; i++) dp[i] = 0.0;
但是这给了我Segmentation fault
,我不确定如何解决此问题。
我尝试过:
for (int i = 0; i < 10; i++) {
dp[i] = new double; // this seems to fix the segmentation problem.
*(dp[i]) = 0.0; // accessing the associated value in order to asign a new value
}
但是我不确定这是否是正确的方法。有人可以详细解释一下动态内存分配吗?
执行double* dp[10]
并创建一个指针数组时。这些指针:它们在内存中指向何处?如果有的话,为什么我不能只使用内存中的那个位置来存储每个双精度数?为什么我必须指定new double
,在指针的类型上不是很明显吗?
对不起,如果我问的是愚蠢的问题,但我还没有完全(实际上完全)不了解这是如何工作的。
谢谢!
答案 0 :(得分:1)
执行double * dp [10]并创建一个指针数组时。
这些行实际上并没有执行任何操作,它只是为栈中的10个指向double
的指针保留了空间。
那些指针:它们在内存中指向何处?
无处,因为它们没有初始化。因此,在它们收到一些有效值之前,请认为它们无效。
为什么我不能只使用内存中的那个位置来存储每个双精度数?
因为您向double
要求了10个 指针 ,而不是10个doubles
。
为什么我必须指定新的double,在指针的类型上不是很明显吗?
是的,但是在C ++中,new
是一个表达式,独立于自己。 C ++可能有类似new(p)
之类的内容,其中p
是一个指针,但事实并非如此:)
但是请注意,您可以使用模板自己实现它:
template <typename T>
void allocate(T* & p, std::size_t n)
{
p = new T[n];
}
或者,在C ++ 11中,您可以根据需要简单地使用auto
:
auto p = new int[10];
说了这么多,如果您已经事先知道确实需要10 doubles
,则可以简单地要求:
double my_ten_doubles[10];
不需要内存分配(昂贵),不需要内存分配(没有内存泄漏),等等。
答案 1 :(得分:0)
double* dp[10];
创建一个指向double的指针数组,该数组在内存中的位置取决于该数组是在函数内部还是在外部,但无论哪种方式,它仅分配该数组,并且您不能依靠具有任何特定值的单个元素让仅靠该值作为可用地址即可。
dp [i] =新的double;分配可以存储一个double的内存,并将指向该内存的指针分配给array元素。然后可以使用* dp [i] = 0.0;为已分配的实际内存分配一个值。