我有一点问题...我想用一个地址初始化一个地址并在这个地址上添加一个值 有这样的事情:
int size = 56;
void *addr1;
void *addr2;
addresse of addr2 = address of addr1 + size
所以addr2比addr1多56个字节 假设addr1和addr2不是NULL。 但我不知道怎么做,你有什么想法吗? 我只是想这样做,知道如何操作和操作地址 感谢
答案 0 :(得分:1)
首先,当你做这样的事情时,使用char*
指针。指针算术+
将正确的操作数时间sizeof(your_pointer)
添加到地址。
因此,对于64位架构,操作addr2 = addr1 + size
不会添加56
,而是添加56*8 = 448
。 sizeof(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];
,然后将各种常量定义为该数组的偏移量。