слушать это не хорошо с ++ путь, вы делаете C в C++ среду , которая в порядке, если это дает некоторое преимущество (IO, проверка типов и т.д.) или для обучения. Динамическое распределение памяти в стиле C полностью ручное. То есть освобождение. Поскольку вы используете typedef, typedef может сделать все более понятным для вас и для компилятора. Вот пример пыток, который, я думаю, делает то, что вы хотите. Обратите внимание, что это делается «The Hard Way», который на самом деле является простым способом в этом случае C стиль кодирования на C++;
#include <iostream>
#include <string>
typedef struct {
char* a;
int b;
} StructA;
typedef StructA* A_p; // A_p is "pointer to structA" (contains address of struct)
typedef A_p* A_p_Array; // A_p_Array is "pointer to A_p" (aka StructA**) contains address of A_p
typedef int* int_Array; // int_Array is "pointer to int" contains address of integer
typedef struct {
A_p_Array A_pointers;
int pcount;
int_Array numbers;
int ncount;
} StructB;
int main()
{
int i;
StructA *sa = new StructA;
StructB *sb = new StructB;
sb->pcount = 5;
sb->ncount = 3;
A_p_Array tmp_A_array;
A_p tmp;
for (i = 0 ; i < sb->pcount; i++)
{
tmp_A_array = new A_p; // create a StructA pointer
tmp = new StructA; // create a StructA
tmp_A_array = &tmp; // put address of tmp in mp_A_array
tmp_A_array++; // increment array address
}
sb->A_pointers = tmp_A_array; // A_pointers now contains address of dynamically created array
tmp_A_array = NULL; // clear pointer but do NOT delete!
int_Array tmp_i_array;
for (i = 0 ; i < sb->ncount; i++)
{
tmp_i_array = new int(0); // c++ can create ints with initial values
tmp_i_array++;
}
sb->numbers = tmp_i_array;
tmp_i_array = NULL; // clear pointer but do NOT delete!
/****** USE Structs A & B *****/
// clean up the heap
A_p Ap;
for (i = 0 ; i < sb->pcount; i++)
{
Ap = sb->A_pointers[i];
delete Ap; // each struct released separately
}
int* ip;
for (i = 0 ; i < sb->ncount; i++)
{
ip = & sb->numbers[i];
delete ip; //each int released separately
}
delete sb;
return 0;
} // main
Есть лучшие способы сделать выше которая является одной из причин, C++ и выше языки были изобретены. Когда вы добираетесь до классов, это будет несколько проще , но вы можете столкнуться с теми же проблемами, что и там , поэтому получение указателей и указателей на указатели вниз теперь послужит вам на доброе место позже.
Ваш код не действителен. C++ и Standard C++ не поддерживают VLA. –
Насколько я знаю, 'int numbers [];' не разрешен как член 'struct' в C++. Это разрешено в C, но только как последний член - другими словами, это 'int ncount;' сразу же также делает его незаконным C. – pyon
Просто сделайте их 'StructA ** указатели;' и 'int * numbers;'. Или, еще лучше, используйте векторы, так как это C++, а не C. – cdhowie