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

如何替换PUTADDR函数?改写其指定调用代码的方法

问题解答

1. 如何替换PUTADDR函数

原PUTADDR函数的核心逻辑是将pSrc指向的内存区域中,长度为sizeof(void*)的指针值复制到pDest指向的指针变量地址中,同时在DEBUG模式下做空指针校验并触发异常。替换方式有以下几种:

方式一:直接用memcpy替代(保留DEBUG校验)

如果需要保留原函数的空指针检查逻辑,可直接复用原函数内的逻辑:

#ifdef DEBUG
if (NULL == pDest || NULL == pSrc) {
    ABENDRTN(C_USERABEND_CODE, C_USERABEND_MSG);
}
#endif
memcpy(pDest, pSrc, sizeof(void*));

若无需DEBUG校验,直接调用memcpy即可,这是原函数的核心执行语句。

方式二:指针类型转换直接赋值

本质是指针值的赋值操作,可通过类型转换简化代码,避免调用memcpy:

#ifdef DEBUG
if (NULL == pDest || NULL == pSrc) {
    ABENDRTN(C_USERABEND_CODE, C_USERABEND_MSG);
}
#endif
*pDest = *(const void**)pSrc;

这种方式更直观,直接将pSrc指向的指针值赋值给pDest指向的指针变量,效果与原函数完全一致。

方式三:封装为宏(适合频繁调用场景)

如果需要复用逻辑,可封装成无函数调用开销的宏:

#define PUTADDR_REPLACEMENT(pDest, pSrc) do { \
    #ifdef DEBUG \
        if ((NULL == (pDest)) || (NULL == (pSrc))) { \
            ABENDRTN(C_USERABEND_CODE, C_USERABEND_MSG); \
        } \
    #endif \
    *(pDest) = *(const void**)(pSrc); \
} while(0)

2. 不使用PUTADDR函数重写指定代码

原代码PUTADDR((void**)&r8_ptr_g, r8_ptr_g+2);的逻辑是:将r8_ptr_g指针偏移2字节后的内存区域中,长度为sizeof(void*)的指针值,复制到r8_ptr_g这个指针变量本身的地址中。可通过以下两种方式重写:

方式一:直接使用memcpy

#ifdef DEBUG
if (NULL == (r8_ptr_g + 2)) {
    ABENDRTN(C_USERABEND_CODE, C_USERABEND_MSG);
}
#endif
memcpy(&r8_ptr_g, r8_ptr_g + 2, sizeof(void*));

注:&r8_ptr_g是指针变量的地址,不会为NULL,实际场景中可省略对它的NULL校验。

方式二:指针类型转换直接赋值

#ifdef DEBUG
if (NULL == (r8_ptr_g + 2)) {
    ABENDRTN(C_USERABEND_CODE, C_USERABEND_MSG);
}
#endif
r8_ptr_g = *(void**)(r8_ptr_g + 2);

这种方式更简洁,直接将r8_ptr_g+2指向的指针值赋值给r8_ptr_g变量,完全等价于原PUTADDR调用的效果。


内容的提问来源于stack exchange,提问作者Aditya Shetty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:01:04