30.03.2017, 07:50 [+3 UTC]
в нашей команде: 1 871 чел. | участники онлайн: 2 (рекорд: 21)

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

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

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

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

:: правила

:: новости

:: участники

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

:: форум

:: блоги

:: поиск

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

:: наш журнал

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

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

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

:: поддержка

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

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

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

Форум:
26.03.2017, 18:27

Последний вопрос:
29.03.2017, 21:31

Последний ответ:
30.03.2017, 04:00

Последняя рассылка:
29.03.2017, 23:15

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

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

Наша кнопка:

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

Отзывы о нас:
13.03.2010, 16:47 »
Матвеев Денис Александрович
Спасибо. Всё очень БЫСТРО, ясно и понятно. Разобрался:) [вопрос № 177215, ответ № 260081]
27.12.2010, 01:03 »
Дмитрий Олегович
И вновь качественный ответ! Большое спасибо! Очень рад что на форуме есть такие люди как вы! [вопрос № 181620, ответ № 265113]
18.04.2010, 12:15 »
shader01
Спасибо, буду думать. [вопрос № 177858, ответ № 260832]

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

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

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

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 668
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 396
Асмик Гаряка
Статус: Советник
Рейтинг: 242

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

Консультация онлайн # 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.12576 сек.

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