我有一个代码,该代码在内存中传递了某个位置。内存中的这个地方指向array
uint32_t *ps2 = NULL;
uint32_t src_address = 0x1ffffc3;
如何从该地址读取array
的值?
我尝试将其投射如下
*ps2 = (void *)src_address;
但是它给我一个错误:invalid conversion from ‘void*’ to ‘uint32_t
此致
答案 0 :(得分:8)
您有两个问题:
首先,指针ps2
是空指针,它没有指向任何地方。这意味着您不能取消引用它。
src_address
不是指针,实际上应该是指针。
总而言之,您对指针及其使用方式的理解似乎有些混乱。
要使其正常工作,首先将ps2
定义为不是指针:
uint32_t ps2;
然后将src_address
定义为指针:
uint32_t *src_address = (uint32_t *) 0x1ffffc3;
最后像普通的指针一样解除对src_address
的引用:
ps2 = *src_address;
可能存在第三个问题:src_address
的地址未与uint32_t
对齐。在某些系统上,未对齐的访问是无效的,并且会导致硬件异常。
答案 1 :(得分:0)
这是因为您不能保证将指针类型转换为任何整数类型。 6.3.2.3(p5)
(临时矿):
任何指针类型都可以转换为整数类型。除了作为 先前指定的结果是实现定义的。 如果 结果不能以整数类型表示,即行为 未定义。结果不必在值的范围内 任何整数类型。
未定义的行为很可能是您看到的编译错误。
有专用的类型intptr_t
,uintptr_t
。它们在7.20.1.4
以下类型指定带符号整数类型,其中 可以将任何有效的指向void的指针都转换为此属性 类型,然后将其转换回指针为void,结果将为 比较等于原始指针
如果您的实现实现了类型,则应使用它们。如果没有,则没有其他符合标准的可移植方式将整数转换为指针。
答案 2 :(得分:0)
您要给指针p2 while(非NULL)。
但是在这里,您将这个值设置为不是指向指针本身,而是指向它指向的内存。
*ps2 = (void *)src_address;
它指向....什么也没有,它是NULL指针(地址0无效)。
通过使用*,您正在访问(或设置)指针所指向的值。因此,您需要删除*才能更改指针本身。
ps2 = (void *)src_address;
甚至更好:
ps2 = (uint32_t*)src_address;
然后从该地址读取值:
uint32_t value = *ps;
答案 3 :(得分:0)
uint32_t *ps2 = NULL; // Assuming this is where you want your array to point.
uint32_t src_address = 0x1ffffc3; // source array
你可以这样做:
ps2 = (uint32_t *)src_address; // Assuming 32 bit machine
现在要访问数组的每个元素,您所要做的就是-
*ps2[0], *ps2[1]
ps2[0]
将指向 src_address + 0。
ps2[1]
将指向 src_address + 4(因为指针类型是 uint32_t
)