C言語の-memset()

1.のmemset()関数プロトタイプのexternボイド*のmemset(ボイド*バッファ、int型のC、INT数)バッファ:またはポインタ配列、

              C:バッファに割り当てられた値であり、

       カウント:バッファの長さがあります。


       このようなアレイを空にするための多機能ソケット:プロトタイプのmemset(バッファ、0、はsizeof(バッファ))であります

       memsetのメモリ部には、「/ 0に初期化され、一般的に、文字列の定義に使用される文字、のすべてを設定する「または」するために使用されます。

      例:[100]チャー;のmemset( '/ 0' はsizeof(a)参照)。

    変数またはアレイ型の構成のmemsetを容易に空。

以下のような:

構造体sample_struct
{
チャーcsName [16]。
ISEQをint型。
int型ITYPE;
}。

 

変数の場合:
構造体sample_strcut stTest。

一般的には、空のstTest方法:

stTest.csName [0] = '/ 0'。
stTest.iSeq = 0;
stTest.iType = 0;

非常に簡単に使用したmemset:
memsetの(&stTest、0、はsizeof(構造体sample_struct));

 

配列の場合:

構造体sample_structテスト[10];

のmemset(TEST、0、はsizeof(構造体sample_struct)* 10)。

 

2.質問:「各バイトの内容は、指定されたASCII値CHのすべてにメモリの一部を指摘しね、第三引数で指定したブロックサイズは、関数がメモリを初期化し、通常は、新しいアプリケーションを実行します作業用法:void *型のmemset(void *型の、文字chを、符号なしのn); "


//何「各バイトsの内容は、すべてのセットは、特定のASCII値をCHにメモリの一部を指摘し、」?なぜ、「この関数は、新しいメモリ・アプリケーションのための最初の仕事をするために通常である。」と言いますか?

:ちょうど割り当てられたメモリ空間、またはあなたは、データ内のメモリ空間を使用しているが、あなたがに設定されたデータ内のこれらのメモリのmemsetを使用することができ、自分のプログラムに影響を与えるためにこれらの無駄なデータを避けるために固定されていませんあなたのプログラムがこれらの無駄なデータによって影響を与えていない場合は、通常の状況下では値が0に設定されている、もちろん、空間的な変数を参照するか、アプリケーション定義は、あなたが期待する何を与えて、当然の「初期化」と呼ばれるこの仕事をしません値は、例えば、ステートメントは、I = 0をint型、それが示す変数iを定義し、0に初期化され、int型J = 5あれば、つまり変数jを定義し、5に初期化されて表示します。

       しかし、割り当てられたメモリの大部分のために、もちろんこのアプローチではない、例えば、int型ARRは、[100];あなたはint型ARR [100] = 0を書いた場合は、100個の要素を含む、アレイARRを定義する;アレイの全内容を初期化するように0は、それが十分ではありません、でも、コンパイラは渡すことはできません。(; iはi = 0 int型この場合初期化は、2つの方法があり、一つは初期化のための等である 100 <; I ++)は、[i]は= 0 ARR、 アレイの初期化が完了しました。もう一つの方法は、memsetとを使用することです:文は十分-memset(編曲、0、はsizeof(ある int型)* 100);
以下のようにパラメータが説明されています。ARRは、アレイ、0の最初のアドレスであるこれらのアドレス割り当ての内容について話しています配列arrの全体の長さを表すために100を乗じはsizeof(INT)を求めるint型の長さは、0です。


         malloc関数によって割り当てられたメモリ場合はもちろん、一般的にのみ明らかに不適切第1の初期化方法で初期化memsetをするために使用されます。

         例:チャーCH [10]
         例示のmemset(CH、0,8)については、前者は後者は必ずしもゼロではなく、ゼロ8個のCHアレイに設定されています。そのようなCHを開始する[1] = 'Z' 、CH [8] = 'A'、CH [9] = 'B'、 [8] CHながらのmemset後、CH [1]、[CH、ゼロであります9]変わりません。

 

3.memset機能の詳細 
       1)ボイド*のmemset(ボイド* S、int型のC、size_tのN)
        総効果:Sメモリ空間は、値にCを第1のnバイトの値を開きました。

       2).memset()関数は、メモリ空間を初期化するために使用されます。例えば:
           CHAR STR [100];
           のmemset(STR、0100)。


       3).memset変数またはアレイを容易構造タイプを空にすることができます。

           如:
           構造体sample_struct {
                      チャーcsName [16]。
                       ISEQをint型。
                       int型ITYPE;
           }。

 

           変数の場合:
           構造体sample_strcut stTest。

           一般に、空の方法stTest:
           stTest.csName [0] = '/ 0';
           stTest.iSeq = 0;
           stTest.iType = 0。

           非常に簡単に使用したmemset:
           memsetの(&stTest、0、はsizeof(構造体sample_struct));

 

           配列の場合:
           ;構造体TEST [10] sample_struct            のmemset(TEST、0、はsizeof(構造体sample_struct)* 10)。

           #include <mem.h>
           ボイド*のmemset(ボイド* S、int型のC、size_tのN){
                     unsigned char型の*はP =(unsigned char型の*)S。

                     一方、(N> 0){
                                * P ++ =(unsigned char型)、C。
                                  -n;
                      }

                     返却値;
           }

 

 
        指定された値のアレイ全体に対するバイトによるバイトとすることができるのmemset関数()。memsetのヘッダファイルで宣言mem.h()関数、それはその最初のパラメータとして配列の先頭アドレスであり、2番目のパラメータは、各バイトの設定値のアレイであり、第三のパラメータは、(配列の長さでありますバイト数ではなく、要素の数)。:関数のプロトタイプである
    ; void *型のmemset(ボイド*、int型、符号なし)
  のvoid *はアドレスを示していることを特徴とします。
  例えば、次のコードは、アレイが完全に0に設定されるようにする、標準関数のmemset()への転送パラメータのアレイを作製するために使用されている:
    の#include <mem.h>
    ボイドメイン()
    {
     ; intはIA1 [50]
     INT IA2 [500]。
     memset(IAI、0.50 *はsizeof(INT));
     のmemset(* ia2,0,500はsizeof(INT));
     //
    }
  最初の引数のmemset()は、パラメータとして、すなわち、アレイ傑作パラメータの配列配列名でありますそればかり配列のアドレスを開始しています。
  memsetの関数()のスタック領域に、パラメータアップ1,2のリターンアドレス順序から。概要最初のパラメータが定義されているアレイIA1 main()関数の開始アドレスです。2番目のパラメータは(0)配列が提供される値であり、3番目のパラメータは、アレイ(* 2 50)の長さです。関数の戻りは、アレイのmain()関数の内容は全て0に設定されている場合。
スタック
0 && image.height> 0){IF(image.width> = 700){this.width = 700; this.height = image.height * 700 / image.width;}}」>


memsetの機能の詳細

1。void *型のmemset(void *型の、 int型のC、size_tのN)
総効果:sのメモリ空間は、値にCを第1のnバイトの値をオープンしました。

2。
の#include

ボイドメイン(){
するchar * S =」黄金グローバル」。

clrscr();

memsetの(S、 'G'、6)。
printf(「%sの」、S);

GETCHAR();
0を返す;
} 
3。memsetの()関数は、メモリ空間を初期化するために使用されます。例えば:
CHAR STR [100];
のmemset(STR、0100)。

4。memsetの()深い意味:一般文字列の定義に使用される文字セットのすべてのためのメモリ空間の部分を、に初期化されている「または」/ 0「;例:[100]チャー;のmemset(A 、 '/ 0' はsizeof(a)参照)。

memcpyのメモリコピーに使用される、あなたは、任意のタイプのデータにそれを取ることができ、オブジェクトのコピー、コピーのデータ長を指定することができ、例:;のmemcpy(B、、はsizeof(B))[50] B、[100]チャー。 sizeof(a)の場合と同様に、bは、オーバーフローメモリアドレスを引き起こすことに注意してください。

strcpyの唯一の文字列をコピーすることができ、それが終了コピー '/ 0' に遭遇する。例:strcpyの(B、A)のように; strcpyの(B)[50] B、[100]チャーノートの文字列の長さ(前第一「/ 0」)50以上であれば、超え、オーバーフローメモリアドレスBを引き起こすであろう。

5.追加:
変数またはアレイ型の構成のmemsetを容易に空に。

如:
構造体sample_struct
{
チャーcsName [16]。
ISEQをint型。
int型ITYPE;
}。

変数の
stTest sample_strcut構造体。

一般に、空の方法stTest:
stTest.csName [0] = '/ 0';
stTest.iSeq = 0;
stTest.iType = 0。

非常に簡単に使用したmemset:
memsetの(&stTest、0、はsizeof(構造体sample_struct));

配列の場合:
;構造体TEST [10] sample_struct のmemset(TEST、0、はsizeof(構造体sample_struct)* 10)。

6。strcpyの
プロトタイプます。externするchar * strcpyの(CHAR * DEST、するchar * SRC);
使用法:nclude#I
機能は:配列にNULL終端文字列srcで示さコピーDESTに言及。
説明:メモリが重複してもしなくても、文字列srcを収容するのに十分なスペースを持っている必要がありますsrcとdestのdestの領域に指摘しました。
DESTを指すポインタを返します。
memcpyの
プロトタイプます。externボイド*のmemcpyを(void *型のdest、void *型SRC、unsigned int型のカウント);
使用法:nclude #I
機能:SRCバイトのメモリ領域で示さコピーカウントメモリ領域がdestに言及。
説明:SRCおよびDEST呼ぶメモリ領域は、関数ポインタDESTへのポインタを返し、重複することはできません。
memsetの
プロトタイプます。extern void *型のmemset(void *型バッファ、int型のC、int型の数);
使用法:nclude #I
機能:最初のカウントメモリ領域の意義の範囲内でバイトのバッファは、文字cに設定されています。
説明:バッファポインタへのポインタを返します。

あなたが任意のタイプのデータにそれを取ることができ、メモリコピーのためのオブジェクトのコピーを使用のmemcpy、コピーのデータ長を指定することができます。

例:[50] B、[100]チャー;のsizeofによって示されるように(A)、Bオーバーフローメモリアドレスを引き起こすであろう;のmemcpy(B、、はsizeof(B))。

strcpyのは、それは「/ 0」を検出したコピーを終了し、文字列をコピーすることができます。

例:[100]、Bチャー[50]; strcpyの(a、b)は、strcpyのように(B、A)、文字列の長さ(前に '/ 0' 最初の)が50以上であることに留意すべきで例えば以上のようなビットは、それがBのオーバーフローのメモリアドレスを引き起こすであろう。

STRのstrncpyをもパラメータ(A、B、N)と共に使用することができます

================================================== ======

memsetの主な用途は、メモリ空間を初期化することです。
memcpyのは、先のスペースにコピー元のデータ空間です。
コピー用strcpyの文字列は、「/ 0」が遭遇終了します。

あなたがこれを理解していれば、あなたがそれらの違いを知っている必要があります。たとえば、あなたがスペースの一部を初期化するとき、memcpyのを使用し、書き方をする必要があり、それは愚かなように見えるではありません。
メートルはint [100]
のmemset((void *型)M、0x00の、はsizeof(int型)* 100); // OK!
memcpy((ボイド*)M、 "/ 0/0/0/0 ...."、はsizeof(int型)* 100); //それは間違っているのです。

 

 

詳細な使用のmemset(RPM)

原型memest(あなたのシェルで「男のmemset」と入力してください)

void *型のmemset(void *型の、int型のC、size_tのN)。

memsetの:メモリブロックのセクションで与えられた値を充填する効果、最速のより大きな構造又はアレイの動作をクリアする方法。

3つの一般的なミス

まず:抗アウト位置cとn。

我々は、[20]はクリアのcharをしたい場合、それは(、0、20)memsetのする必要があることを覚えておく必要があります 
(20、0)というよりも、memsetを

第二:過度の使用memsetを、私は、彼らが初期化されていないメモリを恐れているので、彼らはこのようなコードを書くことができ、これらのプログラマは、いくつかの心理的な影を持っているかもしれないと思います。

チャーバッファー[20]。

memset(バッファ、0、はsizeof((CHAR)* 20))。 
strcpyの(バッファ「123」)。

memsetのは、ここでは、このメモリはすぐに覆われていたので、明確な意味はありませんが、不必要です。

第三:実際には、厳密に言えば、このエラーは、間違ったmemsetを考えることはできないが、それは多くの場合にmemsetを使用した場合に発生します

int型some_func(構造体の何か* A){ 
... 
... 
のmemset(、0、はsizeof(a)参照)。 
... 
}

Q:なぜ、我々はゼロにmemset(&住所、0、はsizeof(アドレス))へのmemsetを使用するのですが、多くの場合、このような使用方法を参照して、実際には、データの分布、および残りのスペースはゼロに設定される場合、ではありません?。

A:あなたが空でない場合は1、かもしれないテスト外れ値の間に表示されます。あなたは(以下の試験結果を見てみましょうか)

チャーBUF [5]。

{str.Format(「%dの「、BUF [i])と(; iが5 <I ++は、I = 0をINT);のため; //のmemset(BUF、0、はsizeof(BUF)); STR、STR1をCStringの0009 + = STR;} TRACE(「%のS / R / N「、STR1)

2.それは真実ではありません!特に文字ポインタタイプに対して、残りの部分は、それが歪みのメッセージボックスを使用してクリアのmemsetない場合、そこに表示され、テスト、文字列、文字の入力ストリングの定義を行うこととすることができる、通常は0であります(0はNULL、その場合は、デフォルトの文字が終了すると、出力が文字化けバックアップではないことを意味します)

Q:

デモがあるように、配列要素の値は、文字が1に設定されていることができ、

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
     char a[5];
     memset(a,’1’,5);
     for(int i = 0;i < 5;i++)
       cout<<a[i]<<”   “;
     system(“pause”);
     return 0;
}
而,如下程序想吧数组中的元素值设置成1,却是不可行的
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
     int a[5];
     memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
     for(int i = 0;i < 5;i++)
       cout<<a[i]<<”   “;
     system(“pause”);
     return 0;
}
问题是:

第二ではないながら1、なぜプログラムは、することができます
2は、使用したくない、またはループしながら、[5] intを初期化するために、行うことができ、それ?(memsetのような誰もが(この関数は、初期化)ありません)

回答:

1.配列の最初のプログラムは、文字で、文字は、メモリサイズが1バイトで占め、memsetの関数はバイトの割り当てであるので、あなたは、出力の問題を持っていないので。すなわち、割り当ての完了後、各アレイ要素の値は0x01010101即ち16843009 10進数、実際になるようにし、第2の整数は、プログラム、またはmemsetのバイト割り当てを使用することです。もしそうなら、あなたは、あなたの出力を見て?

2.のmemset(1,20)を使用した場合、
つまり、メモリの20のバイトは、1つのASCII文字でそれぞれが埋めるために、割り当てを指摘し、バイナリ1に変化することを表す、00000001でありますバイト。4バイトINT要素である、INTの要素の割り当てを完了するために、16843009に等しい、1000000010000000100000001に係合しています。

おすすめ

転載: www.cnblogs.com/mhq-martin/p/11741575.html