Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 29.11.2006, 10:38   #1
tangar
Новичок
Джуниор
 
Регистрация: 29.11.2006
Сообщений: 1
По умолчанию помогите: динамический массив в структуре

Добрый день.
Есть такая пзадача: нужно сделать динамический массив структур, причем в структуре так же существует динамический массив. Помогите разобраться, как его верно заполнять, потому что мои потуги не приводят к положительному исходу. текст того что навоял:

typedef struct {
int *delta; // жинамический массив в структуре
int posN;
int posCnt;
int posCounter;
} l_struct;

// функция, задающая начальные значения
void lampReset(l_struct *lamp) {
lamp = new l_struct;
lamp->delta = new int[3]; //задание памяти под массив
lamp->posN=3;
lamp->posCnt=0;
lamp->posCounter=0;
//собственно само проблеммное место:
for(int i=0;i<3;i++) { lamp->delta[i]=(i+12); };
}

void main(void) {
l_struct *lamp0;
lampReset(lamp0);
printf("\nARRAY:");
for(int i=0;i<3;i++) {
printf("\n%d",lamp0->delta[i]); // выводит чушь
};
};

Заранее спасибо за ответ
tangar вне форума   Ответить с цитированием
Старый 27.12.2006, 14:20   #2
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Извини за запоздалый ответ
проблема не в заполнении массива, а в том что
под динамическую структуру lamp0 память выделяется
внутри процедуры lampReset

если строку
Код:
lamp = new l_struct;
вынести в main
Код:
l_struct *lamp0;
lamp0 = new l_struct;
lampReset(lamp0);
то всё работает нормально.
Почему возникла такаю проблема незнаю...
Umen вне форума   Ответить с цитированием
Старый 27.12.2006, 23:53   #3
comrade
Пользователь
 
Регистрация: 09.11.2006
Сообщений: 24
По умолчанию

оставил камменты, которые, надеюсь, разъяснят ситуацию:
Код:
#include <stdio.h>
typedef struct {
 int *delta; // жинамический массив в структуре
 int posN;
 int posCnt;
 int posCounter;
} l_struct;
// функция, задающая начальные значения
void lampReset(l_struct* lamp) { // здесь создаётся локальная переменная lamp, которая имеет тип - указатель на l_struct
 lamp = new l_struct;
 lamp->delta = new int[3]; //задание памяти под массив
 lamp->posN=3;
 lamp->posCnt=0;
 lamp->posCounter=0;
 //собственно само проблеммное место:
 for(int i=0;i<3;i++) { lamp->delta[i]=(i+12); }; 
 // здесь переменная lamp выходит из области видимости и выделенная память навсегда теряется
 // чтобы этого не происходило необходимо изменить сигнатуру функции чтобы указатель передавался не по значению  а по ссылке 
 // выглядеть это будет воттак: void lampReset(l_struct*& lamp)
}
void main(void) {
 l_struct *lamp0;
 lampReset(lamp0);
 printf("\nARRAY:");
 for(int i=0;i<3;i++) {
  printf("\n%d",lamp0->delta[i]); // выводит чушь
 };
 // но даже если изменить формат вызова в программе всё равно остаются проблеммы:
 // динамическая память выделяется в строках lamp = new l_struct; и lamp->delta = new int[3]; но не удаляется
 // её необходимо удалить воттак:
 // delete[] lamp0->delta;
 // delete lamp0;
 
};
to Umen:
Цитата:
Сообщение от Umen Посмотреть сообщение
всё работает нормально.
Почему возникла такаю проблема незнаю...
твой код проблемму не решает, а лишь добавляет утечек памяти.
Код:
l_struct *lamp0;
lamp0 = new l_struct; // память выделяется, вроде всё ок, но потом она не удаляется и
           // и в функции lampReset память тоже продолжает выделяеться.
lampReset(lamp0);
далее в строке:
Код:
printf("\n%d",lamp0->delta[i]);
происходит обращение к элементам массива delta, память под который не выделялась.
в результате неопределенное поведение и скорее всего а 9 случаях из 10 программа рухнет
иногда, на некоторых компиляторах может срабатывать, но это не говорит о том что всё под контролем.
comrade вне форума   Ответить с цитированием
Старый 28.12.2006, 11:42   #4
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Согласен, пямать зарезервированная под переменные не освобождается в моём коде... (я и не собирался её освобождать :-) )

Цитата:
// чтобы этого не происходило необходимо изменить сигнатуру функции чтобы указатель передавался не по значению а по ссылке
// выглядеть это будет воттак: void lampReset(l_struct*& lamp)
хм, мне казалось что в с++ переменные по умолчанию передаются по ссылке.
Umen вне форума   Ответить с цитированием
Старый 28.12.2006, 13:42   #5
comrade
Пользователь
 
Регистрация: 09.11.2006
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Umen Посмотреть сообщение
Согласен, пямать зарезервированная под переменные не освобождается в моём коде... (я и не собирался её освобождать :-) )
как же не освобождать! этож настоящее зло!
Цитата:
Сообщение от Umen Посмотреть сообщение
хм, мне казалось что в с++ переменные по умолчанию передаются по ссылке.
не. по умолчанию по значению. а чтобы було по сцылке надо явно указывать ссылку - после имени типа ставить амперсанд ( & )
comrade вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 27.12.2007 00:54
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив. Mickle Помощь студентам 9 21.06.2007 20:31
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45
Динамический массив + Dll. LEKA Общие вопросы Delphi 7 11.05.2007 20:05