Мой любимый Segfault !!Зачем? - PullRequest
0 голосов
/ 18 июля 2011

почему это вызывает segfault ??

#include<stdio.h>
#include<stdlib.h>


 struct node 
  {
      double d;
      int *array;
      char c;
  };



  void allocator(struct node *ptr)
  {
      int *tmp;
      tmp = (int*)realloc(ptr, 10);
      if(!tmp)
      {
        ptr->array=tmp;
        ptr->array[0] = 23;
      }
  }


  int
   main()
   {
      struct node *ptr = (struct node*)malloc(sizeof(struct node));
      ptr->c = 'y';
      allocator(ptr);

      printf(" %c\n", ptr->c);      
      printf(" %d\n", ptr->array[0]);
      return 0;
   }

У меня сложилось впечатление, что realloc () в функции распределителя выделяет память, которая также отображается в память, выделенную функцией malloc () в основном ..

а как это могло произойти ?? Разве диспетчер памяти (я полагаю, что lib (stdlib) здесь) не отслеживает свободные и выделенные места в процессе ??

Ответы [ 2 ]

6 голосов
/ 18 июля 2011

Вы выделяете достаточно места для struct node, затем realloc, увеличивая его до 10 байтов, затем обращаясь к члену c, который из-за структуры node, вероятно, превышает 10-й байт.Это вызывает segfault.

Кроме того, если тот, кто занимается бизнесом, решит, что ему нужно переместить блок памяти, realloc возвращает указатель на новое местоположение, но указатель обратно в main все еще указываетна старый блок, который был восстановлен.Это также может привести к segfault.

Также в этом коде:

int *tmp;
tmp = (int*)realloc(ptr, 10);
if(!tmp)
{
  ptr->array=tmp;
  ptr->array[0] = 23;
}

если !tmp, вы получаете доступ к указателю NULL, потому что выВы присваиваете tmp для ptr->array, а затем получаете доступ к 0-му элементу.Это также может привести к segfault.

В вашем коде много проблем.Возможно, вам придется переписать большую часть этого.

1 голос
/ 18 июля 2011

Проблема с этим - попытка получить доступ к нераспределенному указателю, что происходит в main:

printf ("% d \ n", ptr-> array [0]);

Ваша функция размещения назначает пространство для ptr, который является структурой, но не для массива в этой структуре. Возможно, это не то, что вы намеревались сделать (прокомментируйте свой код!).

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