C/C++指针,ptr + 1 = ptr + 1字节或ptr + 1*sizeof(pointer_type)?

kag*_*san 3 c c++ gcc pointers memory-alignment

any_type *ptr = (any_type*)malloc(sizeof(any_type)*size);
my_ptr = ptr+1;
memcpy(dst, my_ptr, sizeof(any_type));
Run Code Online (Sandbox Code Playgroud)

将my_ptr指向ptr后的1个字节,还是sizeof(any_type)ptr后的字节?对齐选项如何影响答案?签名/未签名类型是不同的?

Dav*_*eas 11

指针运算是针对指针的静态类型[*]的大小执行的,因此它将有效地添加sizeof *ptr.成员的对齐将考虑对象的大小,作为类型的对齐(对象末尾的填充).

struct test {
   int a;
   char b;
};
Run Code Online (Sandbox Code Playgroud)

test如果类型是4字节对齐的,则大小不会是5(假设32位整数).

[*]注意,在C++可以分配一个派生对象的基类的地址,但指针运算将在类型操作指针,而不是实际的对象:

struct base { int x; };
struct derived : base { int y; };
int main() {
   base * p = new derived[10];
   base * q = p+1;             // this does not point to the second `derived`!!!
}
Run Code Online (Sandbox Code Playgroud)