memcpy
ポインターによって参照されるデータが のスコープ内にもある場合、コピーされたデータへのポインターを調整しますmemcpy
か? (ないと思いますが、誰も知りません...)
たとえば、ポインターが参照するコンテンツをコピーするとします。問題は、ポインターがばかげて (つまり、変更なしで) コピーされているか、それとも新しくコピーされたコンテンツを指すように調整されているかということです。
memcpy
ポインターによって参照されるデータが のスコープ内にもある場合、コピーされたデータへのポインターを調整しますmemcpy
か? (ないと思いますが、誰も知りません...)
たとえば、ポインターが参照するコンテンツをコピーするとします。問題は、ポインターがばかげて (つまり、変更なしで) コピーされているか、それとも新しくコピーされたコンテンツを指すように調整されているかということです。
いいえ、memcpy はソースから宛先に x バイトをやみくもにコピーします。
たとえば、http: //man7.org/linux/man-pages/man3/memcpy.3.htmlを参照してください。
memcpy
内部で行うことは、仕様の範囲外です。memcpy
外部的には、引数として渡されたポインターのコピーを操作するため、ポインターへの変更は表示されません。
このソースによると、そうではありません。
標準によると、ソース ポインターとターゲット ポインターが重複している場合、動作は未定義です。
valgrind
-manual の例
==27492== Source and destination overlap in
memcpy(0xbffff294, 0xbffff280, 21)
==27492== at 0x40026CDC: memcpy
(mc_replace_strmem.c:71)
==27492== by 0x804865A: main (overlap.c:40)
コピーによってブロックの 1 つが部分的に上書きされる可能性があるため、2 つのブロックをオーバーラップさせたくありません。
...
さらに、これらの関数の多くについて、POSIX 標準には、「オーバーラップするオブジェクト間でコピーが行われる場合、動作は未定義です」という文言があります。したがって、重複コピーは標準に違反します。
ここも見てください:
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.