4

昨日、ループと配列を含む小さなコードを C++ でプログラミングしました。プログラムでは、ループが最初からやり直すたびに配列をリセットする必要があります。ただし、使用する場合

memset(sum,sizeof(sum),0);

その後、配列はすべて0にリセットされません。このプログラムでは、次を使用しました。

for (i=0;i<sizeof(sum)/sizeof(int);i++) sum[i]=0;

代わりは。

ただし、ループは関数ほど明確ではなく、追加の変数が必要だと思います。言うまでもなく、これは memset() 関数の魔法よりも何百万倍もクールではありません。これについて教えていただけますか?

4

5 に答える 5

11

実際には sum のサイズを最初の 0 バイトに書き込んでいます。memset(sum,0,sizeof(sum))あなたは代わりにやっているはずです。

(つまり、引数はtargetdata、 length であり、 data とlengthを間違った順序で指定しました。)

于 2011-04-18T16:53:59.107 に答える
7

これは C++ なので、C++ の方法でfill_n.

std::fill_n(&sum[0], sizeof(sum) / sizeof(sum[0]), 0);

memcpyうまくいかなかった理由は、他の回答で述べたように、2 番目と 3 番目の引数を交換したためです。

編集:出力イテレータfillfill_n提供する、または出力イテレータとして扱うことができるものなら何でも動作します。コンテナのような標準コンテナのvector場合は、コンテナのサイズを事前に設定するかback_inserter、アレイの場合は指定したフォームを使用できます。

于 2011-04-18T16:57:11.693 に答える
4
memset(sum,sizeof(sum),0);

違う。

私はあなたが書きたかったと思います:

memset(sum,0, sizeof(sum));

memset関数のシグネチャは次のとおりです。

void * memset ( void * ptr, int value, size_t num );

そして、その説明は次のとおりです。

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

于 2011-04-18T16:54:01.017 に答える
2

パラメータの順序が間違っていると思います。

cplusplus.comによると、 size パラメーターは最後にする必要があります。

void * memset ( void * ptr, int value, size_t num );
于 2011-04-18T16:54:50.073 に答える
1

関数memsetの構文は次のとおりです。

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

memset() 関数は、s が指すメモリー域の最初の n バイトを定数バイト c で埋めます。

したがって、次のものが必要です。

memset (sum, 0, sizeof(sum));
于 2011-04-18T16:57:51.170 に答える