Выделение массива указателей на двойники - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь инициализировать каждый элемент массива указателей для удваивания со связанным значением 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, разве это не очевидно по типу указателей?

Извините, если я задаю глупые вопросы, но я не совсем понял (на самом деле вообще), какэто работает.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Когда выполняется double * dp [10] и создается массив указателей.

Эти строки на самом деле ничего не выполняют, они просто резервируют пространство (в стеке)на 10 указателей на double.

Эти указатели: куда они указывают в памяти?

Нигде, потому что они не инициализированы.Таким образом, считайте их недействительными до тех пор, пока они не получат какое-то действительное значение.

почему я не могу просто использовать это место в памяти для хранения каждого двойного числа?

Поскольку вы спросилидля 10 указателей до double вместо 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];

Нет необходимости в выделении памяти (дорого), нет необходимости в освобождении памяти (без утечек памяти) и т. д.

0 голосов
/ 17 октября 2018
double* dp[10];

создает массив указателей на удвоение, где этот массив существует в памяти, зависит от того, находится ли массив внутри функции или внешней, но в любом случае он только выделяет массив, и вы не можете рассчитывать на отдельные элементы, имеющиеконкретное значение, не говоря уже о том, что это значение является пригодным для использования адресом.

dp [i] = новый дубль;выделяет память, в которой может храниться значение типа double, и назначает указатель на эту память для элемента массива.Затем вы можете использовать * dp [i] = 0.0;присвоить значение фактической памяти, которая была выделена.

...