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)