3

any_type *ptr = (any_type*)malloc(sizeof(any_type)*size);
my_ptr = ptr+1;
memcpy(dst, my_ptr, sizeof(any_type));

my_ptr 会指向 ptr 之后的 1 个字节,还是指向 ptrsizeof(any_type)之后的字节?对齐选项如何影响答案?有符号/无符号类型有什么不同吗?

4

5 回答 5

11

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

struct test {
   int a;
   char b;
};

如果类型是 4 字节对齐的,则的大小test不会是 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`!!!
}
于 2011-01-24T20:14:19.837 回答
4
  1. ptr 之后的 sizeof(any_type)
  2. malloc 返回适合对齐任何类型数据的内存
  3. 有符号/无符号之间没有区别
于 2011-01-24T20:15:42.233 回答
4

编译器会将该 1 替换为适当的字节数。您所要做的就是指定要移动到的对象的数量。

于 2011-01-24T20:15:52.753 回答
2

当你看到一个指针时,试着忘记它有一个标量值。相反,请认为指针是一种标记,可让您访问存储在连续空间(内存)中的对象。Ifptr是一个指针,可让您访问某个(任意)位置的对象,ptr+1并将ptr-1返回可让您访问其邻居的指针。

于 2011-01-24T20:19:28.857 回答
1

为了使指针算法起作用,它必须指向 sizeof(any_type) + 基地址。

于 2011-01-24T20:15:27.617 回答