LINUX.ORG.RU

Проблема с указателем в ф-ии

 


0

1

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


struct node 
{
	int key;
	struct node* left;
	struct node* right;
        unsigned char height;

};

сама ф-я


void insert(struct node *p, int k)
{
	if( p == NULL ) {
    	p = malloc(sizeof(struct node));
		if(p == NULL) {
			printf("Error allocate memory!\n");
			exit(0);
		}
    	p->key = k;
    	p->left = p->right = NULL;
    	p->height = 0;
		return; 
	} 
	if( k < p->key )
		insert(p->left,k);
	else
		insert(p->right,k);
	balance(p);
}

и вызов из main


int main()
{
 struct node *tree;
 insert(tree,4);
 assert(tree != NULL);

}

Потому что ты передаёшь значение указателя в функцию, а не сам указатель. Тебе нужно либо инициализировать указатель там же, где ты его объявляешь, либо передавать указатель на указатель.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от wandrien

Студент-первокурсник не палится.

А ты C выучил ещё когда в пелёнки опорожнялся, что ли? Быть студентом-первокурсником и, если что-то неясно, задавать вопросы – это прекрасно! Гораздо хуже будет, если ТС задавать вопросы не будет, а вместо этого устроится на работу в компанию, которая твой умный унитаз делает, и тот в итоге будет твои фекалии тебе обратно в задницу отправлять.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Тем не менее, стоит освоить передачу параметров в функции прежде чем браться за динамическую память.

ТС, подумай про код

void setx(int x)
{
  x = 1;
}

int main()
{
  int x = 0;
  setx(x);
  assert(x != 0);
}
anonymous ()

В main вы создали указатель, в который записали произвольный номер ячейки памяти. Допустим, 100. Передаете 100 в функцию. В функции создается локальная переменная p, которой присваивается значение 100. Далее malloc выделяет память по адресу, ну допустим, 200. Присваивает p=200. По выходу из функции эту локальную переменную уже не видно, и никакого воздействия на tree не произошло.

На самом деле, в функции не пройдет проверка на NULL, так как там будет 100. Но если бы вы в main инициализировали tree = NULL, то работало бы так, как я написал.

level1 ()
Последнее исправление: level1 (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Не вижу ничего плохого быть студентом-первокурсником. Не знаю, где ты такое увидел.

Но если ты меня спрашиваешь, то я всегда писал нормальными отступами. Иначе же читать просто невозможно.

wandrien ()

Описание ф-ции должно выглядеть так.

void insert(struct node **p, int k);

и по тексту заменить

p
insert(p->...,k);

на

*p
insert(&p->...,k);
Psilocybe ★★ ()
Ответ на: комментарий от wandrien

Хорошие отступы. Кроме main, очевидно написанной в браузере, и то читать не мешает.

anonymous ()

Интересно, чем ты руководствовался, когда решил вместо возвращаемого значения использовать out параметры.

cloun1902 ()

Потому что в C нет ссылок и ВСЁ передаётся по значению.

--void insert(struct node *p, int k) {
++void insert(struct node **p_ptr, int k) {
++	struct node *p = *p_ptr;
...
--	insert(tree,4);
++	insert(&tree,4);
thunar ★★★★★ ()
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от cloun1902

Заданием в лабе. Но студент небезнадёжен, занялся не перед самой сессией.

Dark_SavanT ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей