我有一个指向数组的指针,我想使用具有特定偏移量的函数,例如 memcpy,但是当偏移指针地址时,我得到的值大于偏移量,我不明白为什么。有人可以解释这里发生了什么吗?
#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t *source[5];
// Initial
printf("%p\n", (void *)source); // 786796896
// Offset by 2
printf("%p\n", (void *)(source + 2)); // 786796912 (unexpected, more than 2)
}
这里的问题是,当您将
2
添加到source
时,数组会衰减为指针类型uint8_t **
。当您对指针执行算术运算时,如果指针元素的大小大于一个字节,则添加的偏移量是添加的 elements 的数量,而不是 bytes 的数量。 source + 2
的字节偏移量实际上是 2*sizeof(*source)
字节,即 16.
要绕过此行为,将
source
转换为 char *
,执行加法,然后返回。但是请注意,如果这样做不正确,可能会导致访问未对齐,这可能是个坏消息。
需要尽可能避免指针算术。对于以上
#include <stdio.h>
#include <stdint.h>
int main() {
uint8_t* source[5]; // array of 5 pointers of uint8_t* type
printf("%p\n", &source[2]); // address of 3rd element place in array source
}