首页 > 解决方案 > 分配结构数组时遇到问题

问题描述

每当我尝试访问结构数据成员时,我的代码就会出现段错误。这必须是因为它没有正确分配。我不知道为什么这不起作用。该结构看起来定义正确。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 ;
}

标签: c

解决方案


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

1) 缺少一个}

2)tempfrac是一个未初始化的指针,但你这样做*tempfrac = ...是未定义的行为,所以任何事情都可能发生。很可能会发生崩溃。也许你忘了malloctempfrac = malloc(sizeof *tempfrac);

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

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;
    ...

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


推荐阅读