FAQ Поиск Пользователи Группы ФотоАльбом  Регистрация Войти и проверить личные сообщения Вход
проблема с realloc [С]

 
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел
Предыдущая тема :: Следующая тема  
Автор Сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Сб Янв 30, 2010 11:30 pm    Заголовок сообщения: проблема с realloc [С] Ответить с цитатой

допустим я объявляю функцию:

Код:

int reall(int *arr, int n)
  {
     arr = (int*)realloc(arr, n*sizeof(int))
     arr[n-1] = 5;
  }


Если я вызываю её в теле main() то всё работает, а если внутри другой функции - то массив забивается случайным мусором. В чём дело и как быть?

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ant_man
Майор


Репутация: 28    

Зарегистрирован: 08.03.2003
Сообщения: 1187
Откуда: с ВИЗа

СообщениеДобавлено: Вс Янв 31, 2010 1:22 am    Заголовок сообщения: Ответить с цитатой

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

сделай передачу указателя по ссылке, либо передавай указатель на указатель, либо указатель сделать глобальным.

_________________
Надо же... живу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Пн Фев 01, 2010 9:21 pm    Заголовок сообщения: Ответить с цитатой

ant_man, спасибо за разъяснение, но

1. небольшая поправка. Код который я привёл оказывается работает нормально Embarassed, неприятности начинаются когда я объявляю массив не целых, а структур, например:

Код:

struct node
{
   float R;
   int numb;
};

int reall(node *nodes, int& n)
{
    n++;
    nodes = (node*)realloc(nodes, n * sizeof(node))
}


2. передача указателя по ссылке запрещена:
Код:

  int reall(node& *nodes, ....)  // ошибка


3. указатель на указатель не помог Sad
Код:

  int reall(node **nodes, ....) 
    {
        node *c;
        c = nodes*;
        ....
    }

- результат как в первом случае.

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ant_man
Майор


Репутация: 28    

Зарегистрирован: 08.03.2003
Сообщения: 1187
Откуда: с ВИЗа

СообщениеДобавлено: Пн Фев 01, 2010 9:53 pm    Заголовок сообщения: Ответить с цитатой

может быть потому что:

1) передавать указатель по ссылке нужно так:

int reall(node * &nodes, ....

2) а пользоваться указателем на указатель так:

node *c;
c = *nodes;

?

ps. функция reall должна возвращать int...

_________________
Надо же... живу...


Последний раз редактировалось: ant_man (Пн Фев 01, 2010 9:54 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Crusher
Подполковник


Репутация: 28    

Зарегистрирован: 13.08.2005
Сообщения: 1728
Откуда: Екатеринбург

СообщениеДобавлено: Пн Фев 01, 2010 9:54 pm    Заголовок сообщения: Ответить с цитатой

Wizard RAA,
1) те же грабли, что и в первом куске кода
2) указателей на ссылки (&*) не существует, тебе надо ссылку на указатель (*&).
3) операция разыменования nodes выглядит как *nodes

_________________
Every now and then say, "What the fuck." "What the fuck" gives you freedom. Freedom brings opportunity. Opportunity makes your future.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Пн Фев 01, 2010 10:39 pm    Заголовок сообщения: Ответить с цитатой

Код:

node *c;
c = *nodes;

да, это я, извините, опечатался.


Спасибо, попробую node * &nodes
Функция возвращает int для другой цели...

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел Часовой пояс: GMT + 6
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы