Консультация № 190036
15.11.2016, 17:52
0.00 руб.
0 1 1
Здравствуйте! Прошу помощи в следующем вопросе: динамический символьный массив в динамическом массиве структур.
Код:

#define n_files 3 // start number of modules (files) in project
#define len_files 25 // length of line with project module name
#define n_var 5 // start number of variables in file
#define len_var 10 // length of variable name
typedef struct
{
char file_name[20],
**var;
int num_of_var;
} EXT_VAR, *P_EXT_VAR;
void main (void)
{
int i=0, k=0, cnt_files=-1, cnt_var=-1;
// Мalloc для массива структур работает
P_EXT_VAR box = (P_EXT_VAR) malloc(n_files*sizeof(EXT_VAR));
// Realloc для массива структур работает
box=(P_EXT_VAR)realloc(box, (10+cnt_files)*sizeof(EXT_VAR));
printf ("More memory for project modules alloced...\n");
// Malloc для символьного массива в структуре работает
box[cnt_files].var=(char**)malloc(n_var*sizeof(char*));
for (i=0; i<len_var; i++)
box[cnt_files].var[i]=(char*)malloc(len_var*sizeof(char));
// Realloc для символьного массива в структуре не работает
box[cnt_files].var=(char**)realloc(box[cnt_files].var, (cnt_var+10)*sizeof(char*));
for (k=0; k<(cnt_var+10); k++)
box[cnt_files].var[k]=(char*)realloc(box[cnt_files].var[k], len_var*sizeof(char));
printf ("Memory for more variables realloced...\n");

free (box); // вся ли выделенная память освобождается?
}


Если выносить этот фрагмент, то пишет ошибку доступа, а в общей программе на realloc'e - срабатывание точки останова.

Обсуждение

давно
Посетитель
7438
7205
15.11.2016, 19:35
общий
это ответ
Здравствуйте, АнтонНР!
Немного подправил. Сравните...
[code h=200]
#include <malloc.h>

#define n_files 3 // start number of modules (files) in project
#define len_files 32 // length of line with project module name
#define n_var 5 // start number of variables in file
#define len_var 10 // length of variable name

#define NULL (char*)0

typedef struct
{
char file_name[len_files], **var; //длины строк лучше выбирать такими,
//чтобы длина структуры была кратна слову
int num_of_var;
} EXT_VAR, *P_EXT_VAR;

int main (void)
{
int i=0, k=0, cnt_files=n_files, cnt_var=n_var; //было cnt_files = -1, а потом индексировалось этим !!!!

P_EXT_VAR box = (P_EXT_VAR) malloc(cnt_files*sizeof(EXT_VAR));

cnt_files += 2;
box=(P_EXT_VAR)realloc(box, (cnt_files)*sizeof(EXT_VAR));

for (k=0; k<cnt_files; k++)
{
box[k].num_of_var = cnt_var;
box[k].var=(char**)malloc(box[k].num_of_var*sizeof(char*));

for (i=0; i<box[k].num_of_var; i++)
box[k].var[i]=(char*)malloc((len_var+1)*sizeof(char));
}

for (k=0; k<cnt_files; k++)
{
box[k].num_of_var += 10;
box[k].var=(char**)realloc(box[k].var, box[k].num_of_var*sizeof(char*));

for (i=cnt_var; i<box[k].num_of_var; i++)
box[k].var[i]=NULL; //обнулим добавленные адреса
//иначе для realloc будет некорректный адрес с вылетом
for (i=0; i<box[k].num_of_var; i++)
box[k].var[i]=(char*)realloc(box[k].var[i], (len_var+11)*sizeof(char));
}

for (k=0; k<cnt_files; k++)
{
for (i=0; i<box[k].num_of_var; i++)
free(box[k].var[i]); //сначала надо освободить память под строки
free(box[k].var); //затем - под массив строк
} //а уж потом - память под массив структур
free (box); // вся ли выделенная память освобождается? Теперь - вся!!!
return 0;
}
[/code]
5
Спасибо большое! Наконец разобрался..
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа