最近、memcpyを実装する必要があるインタビューの質問がありました。私は私の経験でmemcpyをたくさん使ったので、それは難しい問題のようには思えませんでした。
そこで、ポインタからポインタに一度に1つのアドレスをコピーするループの実装を開始しました。次のようになります。
void memcpy(void* dest, void* src, int size){
for(int index = 0; index < size; index++){
dest[index] = src[index];
}
}
ただし、インタビュアーは、memcpyのマニュアルページに「srcからdestにnバイトをコピーする」(後で確認しました)と書かれていることに気づき、代わりにsize / 4で繰り返し処理して、残りを別のインデックスループで取得するように指示しました。 <size%4(32ビットシステムだと思いますか?)
まあ、これは、私がmemcpyを何年も問題なく使用していて、* 4修飾子を付けなくても問題がないことを考えると、奇妙に思えました)。家に帰ったとき、gdbを起動し、小さな文字列 "hello"をコピーし、strlen()と定数の両方でサイズを慎重に入力して、開始位置と停止位置を確認しました。
char* src = "hello";
char* dest = calloc(16, sizeof(char));
int len = strlen(src);
memcpy(dest, src, len); // both my version and official version
ここで、srcとdestを両方とも「hello\0」を含むgdbで注意深く調べました。
だから私の質問は:数字の4(または「バイト単位のサイズ」)を使用することについて私が理解していないことは何ですか?そして、それが実際の動作ではないのに、なぜドキュメントに「nバイト」と記載されているのですか?ここではっきりと見えないものは何ですか?