Я редактирую часть кода, который является частью большого проекта, который использует "константу" для инициализации набора массивов. Поскольку я хочу параметризовать их константа, я должен адаптировать код для использования "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
Это код на C или C++. В тегах написано C++, но код выглядит как C. Почему вы используете malloc
вместо new
?
Чтобы ответить на ваш вопрос. Дайте struct конструктор для выделения памяти и деструктор для ее удаления.
Помните, что в C++ единственная разница между классами и структурами заключается в том, что члены по умолчанию приватны в классе и публичны в структуре.
Используйте конструкторы для выполнения всей инициализации (включая выделение памяти) и деструкторы для освобождения памяти. И не используйте 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;
};
Вы можете создать функцию initialize_bigStruct () и использовать ее после каждого определения bigStruct. Вам нужно будет изменить свой код простым поиском / заменой.
Добавление функций в C запрещено, однако, если вы используете C ++, это совсем другая история.
Я подозреваю, что у вас мало опыта работы с C++. Логичным решением является выделение памяти в конструкторе. Было бы довольно сложно начинать преподавание C++ с этого уровня.
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 внутри структуры, как вы пытались.