0

構造とその信頼性にmemsetとmemcopyを使用することについて質問があります。例:

私はこのようなコードを持っています

typedef struct
    {
    short a[10];
    short b[10];
}tDataStruct;

 tDataStruct m,n;

memset(&m, 2, sizeof(m));
memcpy(&n,&m,sizeof(m));

私の質問は、

1):memsetで0に設定すると、問題ありません。しかし、2を設定すると、maとmbが2ではなく514になります。shortではなくcharとして作成すると、問題ありません。0以外の初期化にmemsetを使用できないということですか?略して制限ですか?

2):上記のタイプshortの2つの構造間でmemcopyを実行することは信頼できますか?私はa、b、c、d、eの巨大な文字列を持っています...私はコピーが1対1で完璧であることを確認する必要があります。

3):上記のような構造で収集するよりも、個々のアレイでmemsetとmemcopyを使用する方が良いですか?

もう1つのクエリ、

上記の構造では、変数の配列があります。しかし、これらの配列へのポインターが渡され、これらのポインターを構造体に収集したい場合

typedef struct
    {
    short *pa[10];
    short *pb[10];
}tDataStruct;

 tDataStruct m,n;

memset(&m, 2, sizeof(m));
memcpy(&n,&m,sizeof(m));

この場合、iまたはmemcopyのmemsetは、値ではなくアドレスのみを変更します。代わりに値を変更するにはどうすればよいですか?プロトタイプは間違っていますか?

提案してください。あなたの入力は非常に影響力があります

ありがとうdsp男

4

1 に答える 1

1
  1. short ではなく memset セットのバイト。いつも。514 = (256*2) + (1*2)... 2 がバイト境界に表示されます。1.a. これは、確かに、あなたがやろうとしているような目的(配列の塗りつぶし)の有用性を低下させます。
  2. 両方の構造体が同じ型である限り信頼できます。明確にするために、これらの構造は、あなたが示唆するように「タイプショート」ではありません。
  3. あなたの質問が理解できれば、それらが同じタイプである限り、問題ではないと思います。

これらはバイトレベルの操作であり、それ以上でもそれ以下でもないことを覚えておいてください。これも参照してください。

質問の2番目の部分については、試してください

memset(m.pa, 0, sizeof(*(m.pa));
memset(m.pb, 0, sizeof(*(m.pb));

2 つの異なるアドレスからコピーする 2 つの操作に注意してください (m.pa、m.pb は、ご存じのように実質的なアドレスです)。sizeof: 参照の sizeof ではなく、参照されている sizeof にも注意してください。memcopy についても同様です。

于 2012-07-27T05:39:40.900 に答える