char* 与 自定义类型 做差 的区别

本文介绍在Cocos2d-X中如何正确管理内存池中的BlockNode节点,对比了两种不同指针操作方法的结果,一种导致程序正常运行,另一种则因野指针引发程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

typedef struct __BlockNode {
    __BlockNode* next;
    __BlockNode():next(NULL){};
}BlockNode;


一、正确的方法

BlockNode* node = (BlockNode*)((char*)pool + (m_nTotalNum - 1) * m_nElementSize);
for (int i = 0; i < (m_nTotalNum - 1); ++i) {
node->next = m_pHeader;
m_pHeader = node;
node = (BlockNode*)((char*)node - m_nElementSize);
}


Cocos2d: size : 131076.

Cocos2d: size BlockNode : 4.
Cocos2d: [MemPool] make pool create 6Buffer, size 131080, num 25, total 3277000, times 1.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 284012720.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283881640.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283750560.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283619480.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283488400.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283357320.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283226240.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283095160.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282964080.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282833000.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282701920.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282570840.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282439760.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282308680.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282177600.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282046520.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281915440.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281784360.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281653280.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281522200.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281391120.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281260040.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281128960.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 280997880.

282833000 - 282701920 = 131080
281653280 - 281522200 = 131080


二、错误的方法

BlockNode* node = (BlockNode*)((char*)pool + (m_nTotalNum - 1) * m_nElementSize);
for (int i = 0; i < (m_nTotalNum - 1); ++i) {
node->next = m_pHeader;
m_pHeader = node;
node = (BlockNode*)(node - m_nElementSize);
}


Cocos2d: size : 131076.
Cocos2d: size BlockNode : 4.
Cocos2d: [MemPool] make pool create 6Buffer, size 131080, num 25, total 3277000, times 1.
Cocos2d: ========= 1 : node - m_nElementSize = 298864768.
Cocos2d: ========= 1 : node - m_nElementSize = 298340448.
Cocos2d: ========= 1 : node - m_nElementSize = 297816128.
Cocos2d: ========= 1 : node - m_nElementSize = 297291808.
Cocos2d: ========= 1 : node - m_nElementSize = 296767488.
Cocos2d: ========= 1 : node - m_nElementSize = 296243168.
Cocos2d: ========= 1 : node - m_nElementSize = 295718848.
// 这里已经挂掉

298864768 - 298340448
297291808 - 296767488 = 524320
298340448 - 297816128 = 524320


关键点:524320 / 131080 = 4 后者是前者的四倍


如果,直接使用 m_pHeader 做差值,地址偏移不是一般的大。导致程序直接崩溃了。

两者的区别在于,前者 是cha*型 指向的对象大小为一字节(这个很重要, 移动的位置的大小, 和这指针指向的实际的元素有关,此时它指向一个char型数据,所以sizeof(char) = 1), 后者为BlockNode*型指向的对象大小为4字节(sizeof(BlockNode) = 4)
所以在做减法的时候,前者 向前移动了 1 * m_nElementSize 个位置,而后者向前移动了 4 * m_nElementSize 个位置。

而我在malloc内存时,是以字节为单位生成内存的,在使用的时候,也应当通过字节来控制分配块的位置,否则以4倍的速度分配,就会像后者,提前走完分配的空间,直接野指针,程序挂掉。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值