C语言自定义malloc(空闲链表)访问结构体成员触发段错误
自定义malloc空闲链表实现的段错误修复
核心问题分析
你触发段错误的直接原因是指针算术的类型错误:curr是freenode*类型,执行curr + size时,编译器会按照sizeof(freenode)的倍数计算偏移量,而非你预期的字节偏移。这导致newnode指向了完全超出当前内存块的非法区域,访问newnode->size自然会触发段错误。
修复方案
把指针偏移的代码改成字节级别的计算:
// 错误写法:按freenode结构体大小偏移 // newnode = curr + size; // 正确写法:先转成char*按字节偏移,再转回freenode* newnode = (freenode*)((char*)curr + size);
这样newnode会准确指向当前内存块分配完用户所需空间后的空闲区域起始位置,后续修改newnode->size和newnode->next就不会访问非法内存了。
额外优化建议
- 增加循环退出逻辑:找到合适的内存块后,应该用
break退出while循环,否则会继续遍历链表,可能重复修改链表结构导致其他异常。 - 确保内存对齐:要保证
size已经对齐到freenode的对齐要求(比如sizeof(size_t)或sizeof(void*)),否则newnode的地址可能不对齐,部分架构下访问不对齐的结构体成员也会触发错误。
修改后的错误区域代码
if (curr->size - size > 32) { returnnode = curr; returnnode->size = size; // 修正指针偏移方式 newnode = (freenode*)((char*)curr + size); newnode->size = curr->size - size; char str[18] = "\nmade it here\n"; write(STDOUT_FILENO, str, 18); newnode->next = curr->next; if (prev) { prev->next = newnode; } else { freelist = newnode; } // 找到块后退出循环,避免重复处理 break; }
内容的提问来源于stack exchange,提问作者Aidan
相关产品推荐
相关产品推荐

