web-dev-qa-db-ja.com

Memsetの定義と使用

関数memset()の有用性は何ですか?.

Definition:ptrが指すメモリブロックの最初のnumバイトを指定値(符号なしcharとして解釈される)に設定します。

これは、メモリアドレスに値をハードコーディングするということですか?

memset(&serv_addr,0,sizeof(serv_addr)は、私が理解しようとしている例です。

誰かが非常に簡単な方法で説明してもらえますか?

43
Brandon Ling

memset()は、比較的単純な操作の非常に高速なバージョンです。

_void* memset(void* b, int c, size_t len) {
    char* p = (char*)b;
    for (size_t i = 0; i != len; ++i) {
        p[i] = c;
    }
    return b;
}
_

つまり、memset(b, c, l)は、アドレスlで始まるbバイトを値cに設定します。上記の実装よりもはるかに高速です。

48
Dietmar Kühl

memset()は通常、値を初期化するために使用されます。たとえば、次の構造体を考えます。

struct Size {
    int width;
    int height;
}

次のようにスタック上にこれらのいずれかを作成する場合:

struct Size someSize;

次に、その構造体の値は未定義になります。それらはゼロであるかもしれず、スタックのその部分が最後に使用されたときからそこにあった値が何であってもよいかもしれません。したがって、通常は次の行を使用します。

memset(&someSize, 0, sizeof(someSize));

もちろん、他のシナリオにも使用できますが、これはそのうちの1つにすぎません。単にメモリの一部を特定の値に設定する方法と考えてください。

38
mattjgalloway

memsetは、データ型に関係なくメモリ領域を0に設定する一般的な方法です。 memsetはデータ型を気にせず、すべてのバイトをゼロに設定すると言うことができます。

C++のIMHOは、C++が提供する型安全性を回避するため、可能な場合はmemsetを行わないようにし、代わりにコンストラクタまたは初期化を初期化手段として使用する必要があります。クラスインスタンスで行われたmemsetは、意図せずに何かを破壊する可能性もあります。

例えば.

class A
{
public:
  shared_ptr<char*> _p;
};

上記のインスタンスのmemsetは、参照カウンターのデクリメントを適切に行いません。

10
Anders

serv_addrは、いくつかのstruct型のローカル変数またはグローバル変数-おそらくstruct sockaddrまたはclass)であると思います。

&serv_addrはその変数のアドレスを取得しています。これは、memsetの最初の引数として指定された有効なアドレスです。 memsetの2番目の引数は、充填に使用されるバイト(ゼロバイト)です。 memsetの最後の引数は、満たすメモリゾーンのサイズ(バイト単位)です。これは、この例のserv_addr変数のサイズです。

したがって、このmemsetの呼び出しは、いくつかのstructを含むグローバル変数またはローカル変数serv_addrをクリアします。

実際には、---([〜#〜] gcc [〜#〜]コンパイラーは、最適化中に、そのための巧妙なコードを生成します。通常、展開およびインライン展開します(実際には、多くの場合、 [〜#〜] gcc [〜#〜]は非常に巧妙なコードを生成できます)。

これは、メモリを特定の値に設定する以外の何物でもありません。

以下にコード例を示します。

Memset(const * p、unit8_t V、unit8_t L)ここで、Pはターゲットメモリへのポインター、Vは値Vに設定されるターゲットバッファーへの値、lはデータの長さです。

while(L --> 0)
{
    *p++ = V;
}
2
Vino

memset-メモリ内のバイトを設定

あらすじ

#include<string.h>

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

説明-memset()関数は、c(符号なしcharに変換された)を、sが指すオブジェクトの最初のnバイトのそれぞれにコピーします。ここで、上記の関数の場合、memset()は値を返します。

1
Ashit