如何解决强制转换为C以访问变量中的特定字节
与所有指针一样,我有一个8个字节长的void *
变量。我正在使用8字节格式的地址,因为它们存储在指针中,但足够小,只能用4个字节表示。我想将void *
变量的前4个字节设为一个地址,而将后4个字节设为另一个地址;
因此,如果我有void *p = 0x0000000000000000
并且有其他指针 void *a = 0x12345678
和void *b = 0x12345678
,我想以void *p = 0x1234567812345678
结尾
我正在尝试通过以下功能来做到这一点:
void set_ptr(void *p,void *first_ptr,void *second_ptr){
*(unsigned int *)(p) = (unsigned int)(first_ptr);
*(unsigned int *)((char*)p + 4) = (unsigned int)(second_ptr);
}
这是工作还是有更好的方法?
解决方法
使用memcpy
。像这样:
void f(void *p,const void *a,const void *b) {
memcpy(&p,&a,4);
memcpy(((char *)p) + 4,&b,4);
}
,
首先,要知道这将非常脆弱且难以携带。显然,如果为具有32位指针的处理器进行编译,它将无法正常工作。但是,如果您只想在计算机上运行某些功能,建议您定义一个新类型,如下所示:
typedef struct {
uint32_t p1;
uint32_t p2;
} DoublePointer;
然后,您可以轻松访问两个指针,作为DoublePointer
结构中的字段。而且,如果您需要将结构分配给单个指针,那也很容易:
DoublePointer doublePointer;
doublePointer.p1 = 0x12345678;
doublePointer.p2 = 0x12345678;
void *frankenpointer = (void*) *((uint64_t*) &dp);
我是否提到这很脆弱?我不建议您走这条路,否则有人会继承此代码并希望他们有不同的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。