如何在c中为地址添加值

时间:2018-02-06 15:41:50

标签: c pointers

我有一点问题...我想用一个地址初始化一个地址并在这个地址上添加一个值 有这样的事情:

int size = 56;
void *addr1;
void *addr2;

addresse of addr2 = address of addr1 + size

所以addr2比addr1多56个字节 假设addr1和addr2不是NULL。 但我不知道怎么做,你有什么想法吗? 我只是想这样做,知道如何操作和操作地址 感谢

3 个答案:

答案 0 :(得分:1)

首先,当你做这样的事情时,使用char*指针。指针算术+将正确的操作数时间sizeof(your_pointer)添加到地址。

因此,对于64位架构,操作addr2 = addr1 + size不会添加56,而是添加56*8 = 448sizeof(char)保证为1,因此不会出现任何问题。

此外,请考虑ssize_t(或者如果尺寸保证为正size_t作为您的尺码变量的类型。

但是,在您的代码示例中,addr1未初始化。在添加之前,必须使用某个地址对其进行初始化,否则添加会导致未定义的行为。对于最终分配给addr1的内存块之外的结果地址也是如此。

答案 1 :(得分:0)

首先,为了避免未定义的行为,您需要保留在已分配的内存区域内。 C标准指定分配的存储器区域外的指针算法是未定义的行为。所以,让我们分配一些内存:

void *addr1 = malloc(1000);

现在,C确实非常聪明。指向存储器区域的指针基本上是一个数组。如果数组的每个元素的大小为4个字节,那么访问内存区域的第二个字节有什么意义呢?嗯,不多,因为这会让你在元素的中间。

因此,在运行以下(伪)代码之后:

T *a;
a = address;
a = a + 10;

a的值为address + 10 * sizeof(T),其中T为某种类型。但是,您无法使用void执行此操作,因为void指针上的指针算法未定义。

因此,您可以做的是将a转换为char*(因为sizeof(char)为1),只需将size添加到其中:

a = (void*)((char*)a + size);

答案 2 :(得分:0)

这些要求没有任何意义。像这样的任务应由系统特定的链接描述文件而不是程序处理。

您在链接器文件中的内容是在一个特定地址分配addr1并在另一个特定地址分配addr2的行。在这样做时,您可能会发现这些指针是无用的,因为您将在固定地址分配一块内存,并且从那里您只需知道偏移量。

因此解决了这个" XY问题"是在固定地址分配一个数组uint8_t array[N];,然后将各种常量定义为该数组的偏移量。