操作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
相关产品推荐
相关产品推荐

