Динамическая память внутри структуры - PullRequest
5 голосов
/ 22 марта 2010

Я редактирую фрагмент кода, который является частью большого проекта, который использует «const» для инициализации группы массивов. Поскольку я хочу параметризовать эти константы, я должен адаптировать код для использования «malloc» для выделения памяти. К сожалению, существует проблема со структурами: я не могу выделить динамическую память в самой структуре. Выполнение этого снаружи может привести к значительным изменениям исходного кода.

Вот небольшой пример:

int globalx,globaly;
struct bigStruct{
    struct subStruct{
            double info1;
            double info2;
            bool valid;
    };
    double data;

    //subStruct bar[globalx][globaly];
    subStruct ** bar=(subStruct**)malloc(globalx*sizeof(subStruct*));
    for(int i=0;i<globalx;i++)
            bar[i]=(*subStruct)malloc(globaly*sizeof(subStruct));


};
int main(){
    globalx=2;
    globaly=3;
    bigStruct foo;
    for(int i=0;i<globalx;i++)
            for(int j=0;j<globaly;j++){
                    foo.bar[i][j].info1=i+j;
                    foo.bar[i][j].info2=i*j;
                    foo.bar[i][j].valid=(i==j);
            }

    return 0;
}

Примечание: в программном коде, который я редактирую, globalx и globaly были const в указанном пространстве имен. Теперь я удалил «const», чтобы они могли действовать как параметры, которые устанавливаются ровно один раз.

Подведены итоги: как правильно распределить память для подструктуры внутри структуры? Большое спасибо!

Max

Ответы [ 5 ]

6 голосов
/ 22 марта 2010

Я подозреваю, что у вас мало опыта работы с C ++.Логическим решением является выделение памяти в конструкторе .Было бы довольно сложно начать обучение C ++ с этого уровня здесь.

4 голосов
/ 22 марта 2010

Это код C или C ++. В тегах написано C ++, но код выглядит как C. Почему вы используете malloc вместо new?

Чтобы ответить на ваш вопрос. Дайте структуре конструктор для выделения памяти и деструктор для ее удаления.

Помните, что в C ++ единственная разница между классами и структурами заключается в том, что члены по умолчанию являются частными в классе, а открытыми по умолчанию в структуре.

1 голос
/ 22 марта 2010

Используйте конструкторы, чтобы выполнить всю инициализацию (включая выделение памяти), и деструкторы, чтобы освободить память. И не используйте malloc, поскольку вы отметили свой вопрос тегом C++. malloc только выделяет память, он не будет инициализировать объекты. В следующем примере показано, как это может выглядеть в C ++:

struct bigStruct{
    struct subStruct{
            double info1;
            double info2;
            bool valid;
    };

    // constructor
    bigStruct( size_t num_of_subs ) : bar( num_of_subs )
    {
    }
    // destructor
    ~bigStruct()
    {
    }        


protected:
    double data;    
    std::vector<subStruct> bar;
};
0 голосов
/ 22 марта 2010
int globalx,globaly;
typedef struct subStruct{
        double info1;
        double info2;
        char valid;
}subStruct;
struct bigStruct{
    struct subStruct ** bar;
    double data;
};
/*Don't bother sending gl.. var since they are global*/
void alloc_struct(struct bigStruct *foo)
{
    int i;
    foo->bar=(subStruct**)malloc(globalx*sizeof(subStruct*));
    for(i=0; i<globalx; i++)
    {
        foo->bar[i]=(subStruct*)malloc(globaly*sizeof(subStruct));
    }
}
int main(){
    int i,j;
    globalx=2;
    globaly=3;
    struct bigStruct foo;
    alloc_struct(&foo);
    for(i=0;i<globalx;i++)
            for(j=0;j<globaly;j++){
                    foo.bar[i][j].info1=i+j;
                    foo.bar[i][j].info2=i*j;
                    foo.bar[i][j].valid=(i==j);
            }
    return 0;
}

Просто предложение в C, где вам нужно вызвать функцию, так как вы не можете использовать malloc внутри структуры, как вы, где пытаетесь.

0 голосов
/ 22 марта 2010

Вы можете создать функцию initialize_bigStruct () и использовать ее после каждого определения bigStruct. Вам нужно будет изменить код с помощью простого поиска / замены.

Добавление функций в C запрещено, однако, если вы используете C ++, это совсем другая история.

...