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 バイトを指しますか、それとも ptr の後のバイトを指しsizeof(any_type)ますか? 配置オプションが答えにどのように影響するか? 署名された/署名されていないタイプでは異なりますか?

4

5 に答える 5

11

ポインター演算は、ポインターの静的型 [*] のサイズに対して実行されるため、実質的にsizeof *ptr. メンバーの位置合わせは、型の位置合わせ (オブジェクトの末尾のパディング) として、オブジェクトのサイズで考慮されます。

struct test {
   int a;
   char b;
};

型が 4 バイトでアラインされている場合、のサイズはtest5 にはなりません (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 に答える