如何转到添加了指针的位置,并将该位置的指针更改为指向新地址
下面的代码只是一个例子,我不想要像ptr[1] = (new addr)
那样简单的方法,而是用以下方法更改地址:
- 创建一个新的指针变量
change_ptr
- 添加指针后转到指定地址
- 将该地址上的指针更改为指向新地址
int *ptr[5];
void *change_addr = ptr[0];
void *p = change_ptr + sizeof(int*);
*p = (void*)(uintptr_t)(new address);
int *ptr[5];
void *p = &(ptr[1]);
&p = (void*)(uintptr_t)(new address);
这就是你要找的吗?
无效指针是一种很好的方法,因为编译器无法为您进行太多错误检查,但如果您坚持使用它们:
#include <stdio.h>
int main(int argc, char ** argv)
{
void * ptrs[5] = {NULL, NULL, NULL, NULL, NULL};
void **p = ptrs+1;
*p = (void*)((uintptr_t)(0x666));
for (int i=0; i<5; i++) printf(" ptrs[%i] is %pn", i, ptrs[i]);
return 0;
}
运行上述程序会产生以下输出:
ptrs[0] is 0x0
ptrs[1] is 0x666
ptrs[2] is 0x0
ptrs[3] is 0x0
ptrs[4] is 0x0
这个版本可能有些过头了。。。
int main() {
union {
void *p;
unsigned long x;
} foo;
int a = 5;
int b = 42;
int *arr[] = { &a, &b };
printf( "Before %dn", *arr[1] );
foo.p = &arr[0];
foo.x += sizeof(int*);
printf( "Still %dn", *(*((int**)foo.p )) );
*(*((int**)foo.p )) = 27;
printf( "After %dn", *arr[1] );
return 0;
}
输出
Before 42
Still 42
After 27
发现我只需要void **
并取消引用它就可以更改地址
int *ptr[5];
void *change_addr = ptr[0];
void **p = (void**)( change_ptr + sizeof(int*) );
*p = (void*)(uintptr_t)(new address);