如何替换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
相关产品推荐
相关产品推荐

