-5

memcpyポインターによって参照されるデータが のスコープ内にもある場合、コピーされたデータへのポインターを調整しますmemcpyか? (ないと思いますが、誰も知りません...)

たとえば、ポインターが参照するコンテンツをコピーするとします。問題は、ポインターがばかげて (つまり、変更なしで) コピーされているか、それとも新しくコピーされたコンテンツを指すように調整されているかということです。

4

6 に答える 6

4

いいえ、memcpy はソースから宛先に x バイトをやみくもにコピーします。

たとえば、http: //man7.org/linux/man-pages/man3/memcpy.3.htmlを参照してください。

于 2013-04-22T12:20:41.763 に答える
0

memcpy内部で行うことは、仕様の範囲外です。memcpy外部的には、引数として渡されたポインターのコピーを操作するため、ポインターへの変更は表示されません。

于 2013-04-22T12:21:07.567 に答える
0

このソースによると、そうではありません。

于 2013-04-22T12:21:26.060 に答える
0

標準によると、ソース ポインターとターゲット ポインターが重複している場合、動作は未定義です。

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. 
于 2013-04-22T12:21:36.590 に答える