2012-03-13 14 views
4

可能性の重複:私は最近使用のmemcpy

int a[10]; 
memcpy(&a, &b ,sizeof(a)); 

驚くべきことに配列名のアドレスでmemcpyを呼び出し、私のプロジェクトにコードを見つけ
C: How come an array's address is equal to its value?

(私に)それはうまくいくようです。

memcpy(a,b,sizeof(a));に変更する必要がありますか?

C++仕様で許可されていますか? 誰でもこの動作に関するリソースを教えてもらえますか?落とし穴がありますか?私も実際に

assert((void*)&a == (void*)a); 

&aを確認

は(それのタイプ以外)aと同じです。

VS2005、VS2008、VS2010でこの現象が確認されました。

答えて

2

配列の名前は配列の先頭のアドレスに評価されるため、2つの配列は同じ意味を持ちます。 How come an array's address is equal to its value in C?を参照してください(これはCの問題ですが、C++でも同じです)。

+0

ええ、あなたがリンクした投稿はすばらしい答えです。 – Kirill

1

あなたが言うように、それは問題ではありません。

パラメータとして渡されると、配列の名前は最初の要素へのポインタに「減衰」します。

4

&aは配列のアドレスです。 aは暗黙的に最初の要素のアドレスに変換できます。両方とも同じアドレスを持つので、両方ともvoid*に変換すると同じ値を返します。

落とし穴がありますか?

memcpyは型保証されていないため、コンパイルされているが動作が悪いコードを書くのは簡単です。例えば、aが配列ではなくポインタである場合、sizeof aはコンパイルされますが、間違った値を与えます。

std::copy(b, std::end(b), a); // will only compile if `b` has a known end. 
1

はい、配列のアドレスは、最初の要素のアドレスと同じです。
memcpyコールを変更する必要はありません。配列の定義が後でポインタに変わるかもしれないことを恐れていない限り(int* a = new int[10];など)。

もちろん、プログラムを変更する場合は、memcpy全体を省略し、代わりに実際のC++を使用することをお勧めします。