You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:05:17