c-指针修改



如何转到添加了指针的位置,并将该位置的指针更改为指向新地址
下面的代码只是一个例子,我不想要像ptr[1] = (new addr)
那样简单的方法,而是用以下方法更改地址:

  1. 创建一个新的指针变量change_ptr
  2. 添加指针后转到指定地址
  3. 将该地址上的指针更改为指向新地址
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);

最新更新