Динамическая память в структуре

Я редактирую часть кода, который является частью большого проекта, который использует "константу" для инициализации набора массивов. Поскольку я хочу параметризовать их константа, я должен адаптировать код для использования "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 и глобально был константой в указанном пространстве имен. Теперь я удалил "константу", таким образом, они могут действовать как параметры, которые устанавливаются точно однажды.

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

Max

5
задан Maximilien 22 March 2010 в 13:50
поделиться

5 ответов

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

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

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

4
ответ дан 13 December 2019 в 19:24
поделиться

Используйте конструкторы для выполнения всей инициализации (включая выделение памяти) и деструкторы для освобождения памяти. И не используйте 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;
};
1
ответ дан 13 December 2019 в 19:24
поделиться

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

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

0
ответ дан 13 December 2019 в 19:24
поделиться

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

6
ответ дан 13 December 2019 в 19:24
поделиться
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
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: