Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法分配结构数组_C - Fatal编程技术网

C 无法分配结构数组

C 无法分配结构数组,c,C,每当我试图访问structs数据成员时,我的代码都会出错。这是因为它没有正确分配。我不知道这为什么不起作用。结构看起来定义正确。malloc看起来设置正确。我使用正确的格式访问数据。然而,每当我尝试访问任何东西时,它都会自动出错 struct fracBlock { struct fracBlock *next ; fraction frac ; } ; static struct fracBlock *fbp ; void init_heap(void){ fbp = NULL ;

每当我试图访问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 ;
}

我想这些就是问题所在,但是如果我犯了错误,请有人给我打电话

如果我有一个整数数组,我将按以下方式分配它:

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分配空间。在为指针赋值时取消对其的引用,但尚未分配堆空间,这会导致SEGFULT,因为您不一定具有写入该内存的权限


但真正的解决办法是。。。垃圾收集。

我想这些就是问题所在,但是如果我犯了错误,请有人给我打电话

如果我有一个整数数组,我将按以下方式分配它:

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分配空间。在为指针赋值时取消对其的引用,但尚未分配堆空间,这会导致SEGFULT,因为您不一定具有写入该内存的权限


但真正的解决办法是。。。垃圾收集。

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

1) 缺少一个
}

2)
tempfrac
是一个未初始化的指针,但您确实执行了
*tempfrac=…
这是未定义的行为,因此任何事情都可能发生。很可能发生撞车事故。也许你忘了
malloc
内存,比如
tempfrac=malloc(sizeof*tempfrac)

3) 即使使用
malloc
*tempfrac=tempBlock[9]->frac分配
tempfrac
仍然错误,因为块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) 缺少一个
}

2)
tempfrac
是一个未初始化的指针,但您确实执行了
*tempfrac=…
这是未定义的行为,因此任何事情都可能发生。很可能发生撞车事故。也许你忘了
malloc
内存,比如
tempfrac=malloc(sizeof*tempfrac)

3) 即使使用
malloc
*tempfrac=tempBlock[9]->frac分配
tempfrac
仍然错误,因为块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;
    ...

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

为什么要使用双指针?您可以编辑代码吗?某个地方缺少结束“}”。除了双指针错误外,
*tempFrac=tempBlock[9]->frac错误,因为
tempFract
未初始化。步骤1:修复所有编译器警告…为什么使用双指针?是否可以编辑代码?某个地方缺少结束“}”。除了双指针错误外,
*tempFrac=tempBlock[9]->frac错误,因为
tempFract
未初始化。步骤1:修复所有编译器警告…1)在C中,您不需要强制转换
malloc
返回的值。可以将空指针指定给任何其他指针。在C语言中,大多数程序员建议不要进行强制转换。因此,推荐的方法是
x=malloc(3*sizeof*x)。2) 我不理解这一部分:“真正的解决方案是……垃圾收集。”C中没有垃圾收集。