我最喜欢的Segfault !!为什么?

时间:2011-07-18 02:40:26

标签: c memory memory-management

为什么这会导致段错误?

#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()分配内存,该内存也映射到main中malloc()分配的内存。

但这怎么可能发生?内存管理器(我猜这里的lib(stdlib))是否跟踪进程中的空闲和分配空间?

2 个答案:

答案 0 :(得分:6)

您为struct node分配足够的空间,然后将realloc分配给10个字节,然后访问c成员,由于node的结构,可能已超过第10个字节。这会导致段错误。

此外,如果决定是否需要移动内存块,那么realloc会返回指向新位置的指针,但main中的指针仍然指向旧块已被收回。这也可能导致段错误。

,在此代码中:

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

如果!tmp,您正在访问NULL指针,因为您正在将tmp分配给ptr->array,然后访问第0个元素。这也可能导致段错误。

您的代码中存在许多问题。您可能需要重写其中的大部分内容。

答案 1 :(得分:1)

这个问题是尝试访问未分配的指针,该指针发生在main:

printf(“%d \ n”,ptr-&gt; array [0]);

您的分配函数为ptr分配空间,ptr是一个结构,但不适用于该结构中的数组。可能这不是你想要做的(评论你的代码!)。