从已知地址访问数组

时间:2019-04-04 08:31:38

标签: c arrays

我有一个代码,该代码在内存中传递了某个位置。内存中的这个地方指向array

uint32_t *ps2 = NULL;
uint32_t src_address = 0x1ffffc3;

如何从该地址读取array的值? 我尝试将其投射如下

*ps2 = (void *)src_address;

但是它给我一个错误:invalid conversion from ‘void*’ to ‘uint32_t

此致

4 个答案:

答案 0 :(得分:8)

您有两个问题:

  1. 首先,指针ps2是空指针,它没有指向任何地方。这意味着您不能取消引用它。

  2. 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_tuintptr_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