将指针数组分配给双打

Allocating array of pointers to doubles

我正在尝试将指针数组的每个元素初始化为具有关联值 0.0 的双精度值。 我有以下代码:

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,指针的类型不是很明显吗?

对不起,如果我问的是愚蠢的问题,但我还没有完全理解(实际上完全不理解)这是如何工作的。

提前致谢!

double* dp[10];

创建一个指向 double 的指针数组,该数组是否存在于内存中取决于该数组是在函数内部还是外部,但无论哪种方式,它都只分配数组,您不能指望具有任何特定的单个元素value 更不用说指望该值是可用地址了。

dp[i] = 新双;分配可以存储 double 的内存,并将指向该内存的指针分配给数组元素。然后你可以使用 *dp[i] = 0.0;为分配的实际内存赋值。

When double* dp[10] is executed and an array of pointers is created.

那几行实际上并没有执行任何东西,它只是为 space(在堆栈中)保留了 10 个指向 double.

的指针

Those pointers: where do they point to in the memory?

无处可去,因为它们没有被初始化。因此,在它们收到一些有效值之前,将它们视为无效。

why can't I just use that place in the memory to store every double?

因为你要求 10 个 指针 double,而不是 10 个 doubles.

Why do I have to specify new double, isn't it obvious by the type of the pointers?

是的,但在 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];

无需内存分配(昂贵),无需内存释放(无内存泄漏)等