例えば、それは私を困惑:C++のデフォルトの割り当て動作は何ですか?
Aのフィールドbuf
を通じて
struct A {
// some fileds...
char buf[SIZE];
};
A a;
a = a;
、それはデフォルトの割り当て操作はYに、オブジェクトXを割り当てることmemcpy
のようなものを呼び出すことのように、おそらく見えますので、どのような自体にオブジェクトを割り当てる場合上にa = a;
のような明示的な割り当て操作は定義されていません。
memcpyのマニュアルページ:
DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas must not overlap. Use memmove(3) if the memory areas do overlap.
使用memcpy
、いくつかの未定義の動作が発生することがあります。
C++オブジェクトのデフォルトの割り当て動作は何ですか?
なぜmemcpyは未定義の動作を引き起こしますか? 2つの異なる配列オブジェクトは重複しません(もちろん、* 1つの*例外がありますが、ここでは関係ありません)。 –
@ R.MartinhoFernandesデフォルトの代入演算の振る舞いがmemcpyの場合、 'a = a'を呼び出すため、メモリ領域は重複してはいけません –
領域からコピーする場合は重複の問題があります文字列に文字を挿入し、 'memcpy(&a [index + 1]、&a [index]、len-index);'を実行します。しかし、 'memcpy(a、a、sizeof(a))'はうまくいくでしょう。 –