每当我试图访问结构数据成员时,我的代码段都会出错。这一定是因为分配不当。我不知道为什么这不管用。结构看起来定义正确。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 ;
}
最佳答案
你在发布的代码中有一些严重的错误。
1)缺少a}
2)tempfrac
是一个未初始化的指针,但您确实*tempfrac = ...
是未定义的行为,因此任何事情都可能发生。很可能发生车祸。也许你忘记了记忆
3)即使使用malloc
分配tempfrac = malloc(sizeof *tempfrac);
,但由于块9中的tempfrac
也未初始化,因此行malloc
仍然是错误的。代码没有意义。。它试图返回(指向)未初始化的值。
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)您从不更新
*tempFrac = tempBlock[9]->frac ;
换句话说,您所做的frac
将进入一个指针,该指针在函数完成时超出范围。所以你有内存泄漏。很可能您不应该使用局部变量fbp
,而是直接在malloc
上操作。比如: 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;
...
也就是说,注意全局变量几乎总是一件坏事。避开他们。
关于c - 无法分配结构数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56087067/