【发布时间】:2011-09-20 22:51:16
【问题描述】:
我有一个名为ptr 的空指针。我想将此值增加多个字节。有没有办法做到这一点?
请注意,我想在没有创建任何变量的情况下在不创造的情况下进行。
我可以做类似ptr = (void *)(++((char *) ptr)); 的事情吗?
【问题讨论】:
我有一个名为ptr 的空指针。我想将此值增加多个字节。有没有办法做到这一点?
请注意,我想在没有创建任何变量的情况下在不创造的情况下进行。
我可以做类似ptr = (void *)(++((char *) ptr)); 的事情吗?
【问题讨论】:
您不能对 void 指针执行算术运算,因为指针算术是根据指向对象的大小定义的。
但是,您可以将指针转换为 char*,对该指针进行算术运算,然后将其转换回 void*:
void* p = /* get a pointer somehow */;
// In C++:
p = static_cast<char*>(p) + 1;
// In C:
p = (char*)p + 1;
【讨论】:
static_cast 就足够了。
MyStruct* 转换为char* 时出现invalid type conversion 错误。是否缺少某些上下文?
void* 转换为任何其他指针类型(可以静态完成),而是MyStruct* - 请参阅here
不能对void 指针进行算术运算。
编译器不知道void 指针指向的项目的大小。您可以将指针投射到 (char *) 以执行此操作。
在 gcc 中有一个扩展将 void 的大小视为 1。所以可以在void* 上使用算术来添加字节偏移量,但使用它会产生不可移植的代码。
【讨论】:
sizeof(void) 产生 1。
-pedantic 进行编译。 :)
只是增加void* 确实在 gcc 中起作用:
#include <stdlib.h>
#include <stdio.h>
int main() {
int i[] = { 23, 42 };
void* a = &i;
void* b = a + 4;
printf("%i\n", *((int*)b));
return 0;
}
但它在概念上(和官方上)是错误的,所以您想明确说明:将其转换为 char* 然后返回。
void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
这表明你增加了字节数。
【讨论】:
-pedantic进行编译。 :) 这是 GCC 的不合格扩展。
你可以这样做:
++(*((char **)(&ptr)));
【讨论】:
++(*((char **)(&ptr))); 伤害小。