C - 指针偏移意外

问题描述 投票:0回答:2

我有一个指向数组的指针,我想使用具有特定偏移量的函数,例如 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)
}
c pointers
2个回答
1
投票

这里的问题是,当您将

2
添加到
source
时,数组会衰减为指针类型
uint8_t **
。当您对指针执行算术运算时,如果指针元素的大小大于一个字节,则添加的偏移量是添加的 elements 的数量,而不是 bytes 的数量。
source + 2
的字节偏移量实际上是
2*sizeof(*source)
字节,即 16.

要绕过此行为,将

source
转换为
char *
,执行加法,然后返回。但是请注意,如果这样做不正确,可能会导致访问未对齐,这可能是个坏消息。


0
投票

需要尽可能避免指针算术。对于以上

#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
}
© www.soinside.com 2019 - 2024. All rights reserved.