Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2015, 11:51   #1
ZerbsCooper
Новичок
Джуниор
 
Регистрация: 26.11.2015
Сообщений: 1
По умолчанию Не работает добавление структуры в массив структур.

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

Вот код программы:
Код:
#include <stdio.h>
typedef struct{
	int id;
	char* name;
} smth;

void appendelement(smth tmp,smth** arr,int len){ //Функция, добавляющая в конец массива структур заданной длины еще одну структуру
	int i=0;
	smth* arr1 = realloc(arr,(len+1)*sizeof(smth));
	free(*arr);
	*arr = malloc((len+1)*sizeof(smth));
	for (i=0;i<len;i++){
			*arr[i]=arr1[i];
	};
	free(arr1);
	*arr[len]=tmp;
	return;
};

void main(void){
	smth* arr = (smth*)malloc(10*sizeof(smth));
	smth tmp;
	tmp.id=3;
	tmp.name="something";
	appendelement(tmp,&arr,10);
};
Текст ошибки:
Цитата:
ОС Windows инициировала точку останова в Dynamiccheck.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Dynamiccheck.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Dynamiccheck.exe

Последний раз редактировалось Stilet; 26.11.2015 в 11:56.
ZerbsCooper вне форума Ответить с цитированием
Старый 26.11.2015, 12:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Смотри мой пример: http://www.programmersforum.ru/showthread.php?t=276520
realloc не просто пересоздает массив, а еще и старые данные сама в него переносит
Так что твои потуги с циклом и освобождениями бессмыслены.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2015, 21:07   #3
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

У вас пара ошибок в коде:
Во-первых,
Цитата:
smth* arr1 = realloc(arr,(len+1)*sizeof(smth));
в этой строчке вы передаёте не указатель на массив, а указатель на указатель
Во-вторых, функция realloc изменяет размер уже существующего блока памяти, а не создаёт новый блок памяти с заданным размером. То есть функцией free вы освобождаете память, которую вам вернула realloc.
_Alerter_ вне форума Ответить с цитированием
Старый 26.11.2015, 21:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
функция realloc изменяет размер уже существующего блока памяти, а не создаёт новый блок памяти
http://www.cplusplus.com/reference/cstdlib/realloc/
Цитата:
The function may move the memory block to a new location (whose address is returned by the function).
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2015, 21:49   #5
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Цитата:
The function may move the memory block to a new location (whose address is returned by the function).
Она может выделить новый блок памяти, но не обязательно сделает это
_Alerter_ вне форума Ответить с цитированием
Старый 26.11.2015, 22:23   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но не обязательно сделает это
Если нужно увеличивать то обязательно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2015, 22:38   #7
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Цитата:
Если нужно увеличивать то обязательно.
Почему вы уверены в этом?
_Alerter_ вне форума Ответить с цитированием
Старый 26.11.2015, 22:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому что в отладчик часто смотрю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2015, 22:50   #9
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Цитата:
Потому что в отладчик часто смотрю.
Аналогично, поэтому считаю, что вы не правы. По крайней мере, в Visual Studio 2015 при расширении массива указатель, возвращаемый realloc, бывает равен переданному указателю в функцию.
_Alerter_ вне форума Ответить с цитированием
Старый 27.11.2015, 10:10   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не вопрос )
Я не против других мнений.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Структуры и массивы структур. Дан массив записей, содержащий сведения о книгах: фамилия автора, название книги, год издания Beauty44 Помощь студентам 3 21.09.2013 13:14
Поиск,добавление и удаление элементов в таблице (массив структур) Dimas23.09.93 Помощь студентам 0 11.12.2012 16:39
калькулятор страуструпа.Добавление структур KirillKirill Помощь студентам 1 29.10.2012 14:14
C++,структуры,NEW,массивы из структур -ushёl- Помощь студентам 2 15.11.2009 20:18
Добавление записей в массив структур korel Общие вопросы C/C++ 2 07.05.2009 23:59