23.07.2017, 15:31 [+3 UTC]
в нашей команде: 2 066 чел. | участники онлайн: 0 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
21.07.2017, 11:30

Последний вопрос:
23.07.2017, 04:56

Последний ответ:
23.07.2017, 13:14

Последняя рассылка:
22.07.2017, 21:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
21.06.2011, 05:33 »
Данилов Артем Владимирович
Спасибо за развернутый ответ [вопрос № 183650, ответ № 267786]
05.07.2010, 13:27 »
Anjali
Спасибо, получилось. [вопрос № 179403, ответ № 262417]
01.03.2011, 21:35 »
Al_Vi_S
Отлично!!! То, что надо! [вопрос № 182345, ответ № 266048]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 296
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 140
mklokov
Статус: 6-й класс
Рейтинг: 106

Перейти к консультации №:
 

Консультация онлайн # 190036
Раздел: • С / С++
Автор вопроса: АнтонНР (Посетитель)
Отправлена: 15.11.2016, 17:52
Поступило ответов: 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 - срабатывание точки останова.

Состояние: Консультация закрыта

Ответ # 274258 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, АнтонНР!
Немного подправил. Сравните...

#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;
}


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 15.11.2016, 19:35

5
Спасибо большое! Наконец разобрался..
-----
Дата оценки: 18.11.2016, 00:47

Рейтинг ответа:

+2

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.13925 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн