web-dev-qa-db-ja.com

Cのmemsetとmemcpyの違いは何ですか

関数ヘッダーを読みましたが、ユースケースの点で正確にどのような違いがあるのか​​まだわかりません。

17
Dirk

memcpy()ある場所から別の場所にコピーします。 memset()は、すべてのメモリを同じ値に設定するだけです。

例:

memset(str, '*', 50);   

上記の行は、文字列strの最初の50文字を*(またはmemsetの2番目の引数)に設定します。

memcpy(str2, str1, 50); 

上記の行は、str1の最初の50文字をstr2にコピーします。

43
Peter

memset()は、指定されたバッファ内のすべてのバイトを同じ値に設定します。memcpy()は、バイトのシーケンスを別の場所からバッファにコピーします。

char a[4];
memset(a, 7, sizeof(char)*4);
/*
* a is now...
*
* +-+-+-+-+
* |7|7|7|7|
* +-+-+-+-+
*/

char b[] = {1,2,3,4};
char c[4];
memcpy(c, b, sizeof(char)*4);
/*
* c is now...
*
* +-+-+-+-+
* |1|2|3|4|
* +-+-+-+-+
*/
16
Amber

memsetは、メモリのブロックを単一の値に設定します。 memcpyは、ブロックのコンテンツを別のブロックにコピーします。

おそらく、memcpymemmoveの違いに興味があるでしょう。どちらも同じことをしますが、ソースと宛先が重複していても後者は機能します。

3
Tordek

memset()は、メモリブロック内のすべてのバイトを特定のchar値に設定するために使用されます。 Memsetは、初期化値であるため、charでもうまく機能します。

memcpy()はメモリ間でバイトをコピーします。コピーされるこのタイプのデータは無関係であり、バイトごとのコピーを作成するだけです。

2
Kyle Rozendo

memcpy()ある場所から別の場所にコピーします。 memset()は、すべてのメモリを同じに設定するだけです。

たとえば、ここでは、文字列strの文字列の長さを*(またはmemsetの2番目の引数)に設定します。

_memset(str, '*', strlen(str)+1);   
_

ここでは、文字列srcの文字列長をdestにコピーします。

memcpy(dest, src, strlen(src)+1);

0

memset fillmemoryと定数バイト

void * memset(void * s、int c、size_t n);

Memsetの使用は、プログラマーがメモリを特定のもので直接埋めることができることです。 memcpyは、変更できないソースへのconstantvoidポインターを使用します。

memcpyはmemory領域をコピーします

void * memcpy(void * dest、const void * src、size_t n);

参照 memcpymemset

0
Punit Vara