将指针数组分配给双打
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];
无需内存分配(昂贵),无需内存释放(无内存泄漏)等
我正在尝试将指针数组的每个元素初始化为具有关联值 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];
无需内存分配(昂贵),无需内存释放(无内存泄漏)等