Как инициализировать массив указателей на структуру в C ++? - PullRequest
0 голосов
/ 20 февраля 2011

ОБНОВЛЕНИЕ: Ответ внизу.

Привет, ребята,

Как инициализировать «массив указателей на структуру»?Уловка в том, что массив является переменной-членом, а размер, передаваемый объявлению массива в конструкторе, является переменной сущностью.


    typedef struct Node {
        string key;
        int value;
        struct Node * left;
        struct Node * right;
    }doubly;

    class myHashStrKey{

    private:
        size_t hashsize;
        doubly * table[];

    public:
        myHashStrKey(){
            hashsize = ((size_t)-1);
            doubly * table[hashsize];
            memset(table,NULL,hashsize);// This is giving segmentation fault
        }

    };

//Called constructor;    myHashStrKey sss = myHashStrKey();

Здесь я хочу, чтобы таблица была массивом указателей на Doublyузлы и я хочу, чтобы все указатели были инициализированы в NULL.Что не так с этим кодом здесь?Какой еще лучший способ выполнить вышеизложенное?Заранее спасибо.

ОБНОВЛЕНИЕ:

После обсуждения, учитывая большой размер, я подменил код.Но как заполнить векторную таблицу определенным количеством значений NULL? Я пробовал приведенный ниже код, но он не работает.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Массивы переменной длины не поддерживаются стандартом C ++. Вместо этого просто используйте std::vector:

private:
    std::vector<doubly *> table;

...

myHashStrKey()
    : table(num_elements, NULL)  // Initialises vector
{
    ...
}
0 голосов
/ 20 февраля 2011

Как уже отмечалось, вы должны действительно использовать std :: vector.

Вы, вероятно, должны более внимательно посмотреть, что может предложить STL.В противном случае вы упустите много хороших возможностей C ++ и будете делать C с классами.Попробуйте также познакомиться с RAII, чтобы узнать больше о возможностях управления памятью в C ++ (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization). Такие вещи, как memset, на самом деле мало используются в современном C ++.

0 голосов
/ 20 февраля 2011

Линия

        doubly * table[hashsize];

создает локальную переменную table, которая перекрывает элемент с тем же именем.

Также обратите внимание, что строка

        memset(table,NULL,hashsize);// This is giving segmentation fault

неверен, поскольку устанавливает hashsize байт , тогда как ваш table является массивом hashsize указателей , каждый из которых содержит более одного байта (обычно 4 на 32-битной машине), т.е. sizeof(table) >= hashsize * sizeof(doubly*)

Однако, вероятно, segfault является результатом попытки записать огромный кусок памяти (по крайней мере, 4 ГБ), как указывал @Nawaz).

...