【问题标题】:My fav Segfault!! why?我最喜欢的Segfault!!为什么?
【发布时间】:2011-07-18 02:40:25
【问题描述】:

为什么会导致段错误??

#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))不跟踪进程中的空闲和分配空间吗?

【问题讨论】:

  • 如果 realloc 移动指针,即分配器中的“tmp”与“ptr”不同,那么在调用函数(main)中,ptr 不再是有效指针。您需要将更改后的指针返回到 main。
  • 是的,是的......但我试图重新分配 int 指针数组而不是结构节点本身......即 realloc(ptr->darray, 10) 挣扎了一个小时左右它....只能在收到 cmets 后才发现这个愚蠢的错误解决了无论如何谢谢

标签: c memory memory-management


【解决方案1】:

你为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-&gt;array,然后访问第0 个元素。这也可能导致段错误。

你的代码有很多问题。您可能需要重写大部分内容。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2015-08-06
      • 2011-01-03
      相关资源
      最近更新 更多