无法分配结构数组

时间:2019-05-11 04:01:03

标签: c

每当我尝试访问structs数据成员时,我的代码段就会出错。这必须是因为未正确分配。我不知道为什么这不起作用。该结构看起来像已正确定义。 malloc看起来好像已正确设置。我使用正确的格式访问数据。但是,只要我尝试访问任何内容,它都只会出现段错误。

struct fracBlock {
  struct fracBlock *next ;
  fraction frac ;
} ;

static struct fracBlock *fbp ;

void init_heap(void){ fbp = NULL ; }

fraction *new_frac(void){
  struct fracBlock **tempBlock ;
  struct fracBlock *prev ;
  struct fracBlock *curr ;
  fraction *tempFrac ;
  fraction testFrac ;
  int i ;
//if free list is empty malloc 10 blocks
  if ( fbp == NULL ){
    tempBlock = ( struct fracBlock** )malloc(10*sizeof(struct fracBlock)) ;

  //if no more space left
  if ( tempBlock == NULL ) {
    printf( "\nError: No more memory space left for allocation!\n" ) ;
    exit(1) ;
  }

  tempBlock[0]->next = tempBlock[1] ;
  tempBlock[1]->next = tempBlock[2] ;
  tempBlock[2]->next = tempBlock[3] ;
  tempBlock[3]->next = tempBlock[4] ;
  tempBlock[4]->next = tempBlock[5] ;
  tempBlock[5]->next = tempBlock[6] ;
  tempBlock[6]->next = tempBlock[7] ;
  tempBlock[7]->next = tempBlock[8] ;
  tempBlock[8]->next = NULL ;
  *tempFrac = tempBlock[9]->frac ;

  return tempFrac ;
}

2 个答案:

答案 0 :(得分:3)

发布的代码中存在许多严重的错误。

1)缺少}

2)tempfrac未初始化的指针,但是您进行*tempfrac = ...是未定义的行为,因此可能会发生任何事情。可能会导致崩溃。也许您忘记了malloc之类的tempfrac = malloc(sizeof *tempfrac);记忆

3)即使使用tempfrac分配了malloc,行*tempFrac = tempBlock[9]->frac ;仍然是错误的,因为块9中的frac也未初始化。该代码是没有意义的。它试图返回(指向)未初始化的值。

4)使用双指针是错误的。代码应该更像:

  struct fracBlock *tempBlock ;  // Single *

  if ( fbp == NULL ){
    tempBlock = malloc(10*sizeof *tempBlock) ;

    //if no more space left
    if ( tempBlock == NULL ) {
      printf( "\nError: No more memory space left for allocation!\n" ) ;
      exit(1) ;
    }

    tempBlock[0].next = tempBlock + 1; // or tempBlock[0].next = &tempBlock[1];
    tempBlock[1].next = tempBlock + 2;
    ...

5)您永远不会更新fbp,换句话说,您执行的malloc会进入一个指针,该指针在函数完成时会超出范围。所以你有内存泄漏。您很可能不应该使用局部变量tempBlock,而应直接在fbp上进行操作。喜欢:

  if ( fbp == NULL ){
    fbp = malloc(10*sizeof *fbp) ;

    //if no more space left
    if ( fbp == NULL ) {
      printf( "\nError: No more memory space left for allocation!\n" ) ;
      exit(1) ;
    }

    fbp[0].next = fbp + 1;
    fbp[1].next = fbp + 2;
    ...

也就是说,请注意,全局变量几乎总是一件坏事。避免它们。

答案 1 :(得分:0)

我认为这是问题所在,但是如果我做错了,请有人叫我出来。

如果我有一个整数数组,则以这种方式分配它:

int * x ; // Array of length 3
x = ( int * ) malloc( 3 * sizeof( int ) ) ;

我将x转换为int *,因为malloc将返回堆中的地址,并且我希望将该地址解释为指向整数的指针。但是,我想在malloc调用中使用int,因为我想为3种int类型分配足够的空间。

因此,由于这个原因,您将要使用sizeof( struct fracBlock * )而不是sizeof( struct fracBlock )。您还需要使用malloc调用为该数组的每个元素分配空间。这是因为数组的每个元素都是一个指针,并且在分配它时,它不一定指向您已分配的任何空间。

此外,我认为您需要通过另一个malloc调用为tempFrac分配空间。您在给指针分配值时取消了对指针的引用,但是尚未分配堆空间,这会导致段错误,因为您没有必要有权写入该内存。

真正的解决方案是...垃圾回收。