c - 分配结构数组时遇到问题
问题描述
每当我尝试访问结构数据成员时,我的代码就会出现段错误。这必须是因为它没有正确分配。我不知道为什么这不起作用。该结构看起来定义正确。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) 缺少一个}
2)tempfrac
是一个未初始化的指针,但你这样做*tempfrac = ...
是未定义的行为,所以任何事情都可能发生。很可能会发生崩溃。也许你忘了malloc
像tempfrac = 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;
...
也就是说,请注意全局变量几乎总是一件坏事。避开他们。
推荐阅读
- java - Java从API接收日期时将日期更改为下一天
- android - 使用适用于 Android 的 OpenTok lib 时,相机屏幕未显示在另一侧
- python-3.x - 在任务计划程序中使用网络驱动器
- json - 用胶水爬虫读取json返回UNKNOWN分类
- python - 在单独的文件中加载保存的模型 Tensorflow-Keras M1 Mac
- python-3.x - 是否可以在空手道测试中集成 Python 脚本?
- spring-boot - 如何在 Mockito 中模拟 Cutom 注释或任何注释
- redis - Springboot应用程序无法启动
- javascript - 无法显示 PDF | file:// + href + IP Server + 不允许加载本地资源
- prolog - 简化 CLP 难题中的约束