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

操作Transaction结构体数组触发Segmentation Fault问题求助

事务池子进程段错误问题修复

问题根源

1. 内存分配类型不匹配

initTransactionPool函数中,transactionPool是指向struct Transaction的指针,但你分配内存时计算的是指针的大小,而非结构体本身的大小:

// 错误:分配的是SO_TP_SIZE个指针的空间
transactionPool = (struct Transaction *)malloc(SO_TP_SIZE * sizeof(struct Transaction *));

当你通过transactionPool[sizePool] = transaction给结构体赋值时,实际写入的内存超出了分配范围,会随机触发段错误。

2. 未初始化的sizePool

代码中未对sizePool做初始化,它的初始值是随机垃圾值。如果初始值接近或超过SO_TP_SIZE,会直接导致数组越界访问,触发段错误。

修复方案

修正内存分配与初始化

void initTransactionPool()
{
    // 分配SO_TP_SIZE个Transaction结构体的内存
    transactionPool = (struct Transaction *)malloc(SO_TP_SIZE * sizeof(struct Transaction));
    // 初始化事务池计数为0
    sizePool = 0;
}

调整事务池边界判断

原边界判断逻辑有误,事务池从0开始计数,最大可容纳SO_TP_SIZE个元素,修正addTransaction:

int addTransaction(struct Transaction transaction)
{
    if (sizePool >= SO_TP_SIZE)
        return -1;
    transactionPool[sizePool] = transaction;
    ++sizePool;
    return 0;
}

额外注意事项

  • 确保sizePool在全局或合适的作用域中定义为int sizePool;,避免未定义行为。
  • 检查共享内存调用shmget的返回值,如果返回-1说明共享内存不存在或权限不足,需提前处理,避免后续shmat出错。

内容的提问来源于stack exchange,提问作者Matteo Pagliarello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:03:12