‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

malloc

Наверное, я уже спятил.

Ситуация: есть указатель, непроинициализированный ещё. Допустим, *ptr.

Вызываем функцию, которая выделяет память при помощи библиотечной malloc (пробовал и g_malloc тоже). Функция внутри себя проверяет, что память выделилась успешно, заполняет поля некой структуры, и выходит - возвращая нуль (а в случае ошибки возвращает -1).

В main проверяем состояние указателя до и после вызова это функции - в обоих случаях (!) он равен NULL, то есть malloc словно бы не сработал. При этом, ессно, любое обращение к полям вышеозначенной структуры даёт в лучшем случае segmentation fault.

Что за херота? Почему всегда оно работало, а щас вдруг перестало?

Вот фрагмент кода main.c:
  bcircular_t *Fifo;

  printf ("Before: %p\n", Fifo);
  result = bcircular_init (Fifo, 1024);
  printf ("(%d) After: %p\n", result, Fifo);


Фрагмент кода circular.c (всегда работавший и неоднократно применявшийся ранее):
....
int bcircular_init (bcircular_t *c, uint16_t depth)
{
   bcircular_verbose (c, "init ");
   c = (bcircular_t *)g_malloc0(sizeof(bcircular_t));
   if (c == NULL)
   {
      bcircular_verbose (c, "failed - can't alloc structures\n");
      return -1; /* fail */
   }
   else
   {
      .....
      return 0;
   }
}





Add А вот ИСПРАВЛЕННЫЙ фрагмент (поскрипана несущественная в данном случае часть кода):
int bcircular_init (bcircular_t **pc, uint16_t depth)
{
	bcircular_t *c;
	c = (bcircular_t *)g_malloc0(sizeof(bcircular_t));
	bcircular_verbose (c, "init ");
	if (c == NULL)
	{
		bcircular_verbose (c, "failed - can't alloc structures\n");
		return -1; /* fail */
	}
	else 
	{
		bcircular_verbose (c, "ok\n");
		*pc = c;
		return 0;
	}
}

Всё, работает. Без лишних вопросов стреляет в ногу.
Tags: жопа
Subscribe

  • Кое-что бесит.

    Дожив до седых волос, сделав множество работоспособных и ещё больше неработоспособных электронных штук, понял, что в моих познаниях есть некий…

  • Об экстраполяциях.

    Вот нам говорят - в прошлом компьютеры были ламповыми. Мол, первый программируемый компьютер универсального назначения, ENIAC, был создан в 40ых…

  • Плоская Земля и все-все-все.

    Честно, я уже немного в ужасе от того, с какой лёгкостью и как быстро пипл хавает "истину". Сотни и даже тысячи лет развития науки, поиск, озарения,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 35 comments

  • Кое-что бесит.

    Дожив до седых волос, сделав множество работоспособных и ещё больше неработоспособных электронных штук, понял, что в моих познаниях есть некий…

  • Об экстраполяциях.

    Вот нам говорят - в прошлом компьютеры были ламповыми. Мол, первый программируемый компьютер универсального назначения, ENIAC, был создан в 40ых…

  • Плоская Земля и все-все-все.

    Честно, я уже немного в ужасе от того, с какой лёгкостью и как быстро пипл хавает "истину". Сотни и даже тысячи лет развития науки, поиск, озарения,…