C ++: динамическая инициализация двойного указателя - PullRequest
0 голосов
/ 30 мая 2018

Буду признателен за помощь в инициализации двойного указателя.вот мой код:

EstablishmentCloud_site **__ptrTest;
EstablishmentCloud_site siteCloud;

__ptrTest = new EstablishmentCloud_site *[1];
siteCloud.f_site_id="site";
siteCloud.f_status="status";
siteCloud.f_name="name";
*(__ptrTest[0])=siteCloud;

Кажется, что инициализация __ptrTest неверна, потому что я получаю «Место чтения нарушения доступа».Каков хороший синтаксис?

Конечно, в конце этот код будет в цикле, чтобы вставить несколько EstablishmentCloud_site в мой __ptrTest.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

С вашей помощью мне удалось создать эту функцию.Надеюсь, это не такой дерьмовый код!Спасибо!

establishmentConversion(mySourceObject establishmentSource)
{
    EstablishmentCloud__establishment       establishmentCloud;

    [...]

    establishmentCloud.site_list = new EstablishmentCloudcloud_siteArray;
    establishmentCloud.site_list->__ptr = new EstablishmentCloud__cloud_site *;
    for(int i=0; i<(*(establishmentSource.site_list)).__size; i++)
    {
        establishmentCloud.site_list->__ptr[i] = new EstablishmentCloud__cloud_site;
        establishmentCloud.site_list->__ptr[i]->f_site_id=(*((*(establishmentSource.site_list)).__ptr[i])).f_site_id;
        establishmentCloud.site_list->__ptr[i]->f_status=(*((*(establishmentSource.site_list)).__ptr[i])).f_status;
        establishmentCloud.site_list->__ptr[i]->f_name=(*((*(establishmentSource.site_list)).__ptr[i])).f_name;
    }

    return establishmentCloud;
}
0 голосов
/ 30 мая 2018

Используемый синтаксис зависит от того, чего вы пытаетесь достичь.В нынешнем виде неясно, есть ли синтаксическая ошибка или логическая ошибка.

Вот что говорит текущий синтаксис (пропуская некоторые несущественные шаги):

  1. Создать массив указателей (изначально эти указатели являются мусором) .
  2. Назначить значение объекту, на который указывает первый из этих указателей (но поскольку указатель содержит мусор,разыменование это нарушение доступа) .

Вы пропустили шаг, на котором указателю присваивается допустимое значение.Если цель состоит в том, чтобы указать на siteCloud, ответ Killzone Kid - это правильный путь (ptrTest[0] = &siteCloud; Я не собираюсь выступать за использование двойного подчеркивания ).Если вы хотите скопировать значения из siteCloud в объект, на который указывает элемент массива, вам сначала нужно создать этот объект (что-то вроде ptrTest[0] = new EstablishmentCloud_site).

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

...