関数memset()
の有用性は何ですか?.
Definition:ptrが指すメモリブロックの最初のnumバイトを指定値(符号なしcharとして解釈される)に設定します。
これは、メモリアドレスに値をハードコーディングするということですか?
memset(&serv_addr,0,sizeof(serv_addr)
は、私が理解しようとしている例です。
誰かが非常に簡単な方法で説明してもらえますか?
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
に設定します。上記の実装よりもはるかに高速です。
memset()
は通常、値を初期化するために使用されます。たとえば、次の構造体を考えます。
struct Size {
int width;
int height;
}
次のようにスタック上にこれらのいずれかを作成する場合:
struct Size someSize;
次に、その構造体の値は未定義になります。それらはゼロであるかもしれず、スタックのその部分が最後に使用されたときからそこにあった値が何であってもよいかもしれません。したがって、通常は次の行を使用します。
memset(&someSize, 0, sizeof(someSize));
もちろん、他のシナリオにも使用できますが、これはそのうちの1つにすぎません。単にメモリの一部を特定の値に設定する方法と考えてください。
memset
は、データ型に関係なくメモリ領域を0に設定する一般的な方法です。 memset
はデータ型を気にせず、すべてのバイトをゼロに設定すると言うことができます。
C++のIMHOは、C++が提供する型安全性を回避するため、可能な場合はmemset
を行わないようにし、代わりにコンストラクタまたは初期化を初期化手段として使用する必要があります。クラスインスタンスで行われたmemsetは、意図せずに何かを破壊する可能性もあります。
例えば.
class A
{
public:
shared_ptr<char*> _p;
};
上記のインスタンスのmemset
は、参照カウンターのデクリメントを適切に行いません。
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;
}
memset-メモリ内のバイトを設定
あらすじ
#include<string.h>
void * memset(void * s、int c、size_t n)
説明-memset()関数は、c(符号なしcharに変換された)を、sが指すオブジェクトの最初のnバイトのそれぞれにコピーします。ここで、上記の関数の場合、memset()は値を返します。