void foo(void *ptr, int numBytes)
{
(char*)ptr += numBytes;
}
这不能在 C 中编译。我知道替代方案。但为什么这不起作用呢?问题是什么?
问题
问题是(char*)ptr
不会产生lvalue,这意味着该值无法修改 - 人们可以将其视为强制转换的临时结果,强制转换将产生一个rvalue类型的char*
.
它在语义上与下面的示例相同,强制转换会产生一个临时值,这样的值不能被分配新值。
int x = 123;
(float)x += 0.12f; /* (1), illegal */
/* ^-- sementically equivalent to `123.f += 0.12f` */
Solution
在您的问题中,您已经声明您已经知道此问题的解决方法,但我想明确编写解决方案以展示如何修改ptr
即使转换产生不可修改的值。
- 获取您的地址指向空的指针,
- 将此地址转换为指向 char 的指针,
- 取消引用该指针,产生指向字符的指针,
- 修改这个产量lvalue就好像原来的一样
void*
是类型char*
*((char**)&ptr) += numbytes; // make `ptr` move forward `numbytes`
( Note:当取消引用指针时,您会得到一个lvalue,否则将无法更改该值指向值位于存储在指针中的地址处。 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)