1

これは非常に単純な質問である場合とそうでない場合がありますが、任意の時点で配列に含まれるバイト数を把握するために呼び出す関数を知りたいと思います。たとえば、以下のコードのsendコマンドの3番目の引数として何を入力するかをどのように知ることができますか?

int *array= new int[500];
memset(array, 0, sizeof(array));

//newsockfd is declared elsewhere in the code
send(newsockfd, array, _______, 0);
4

4 に答える 4

5

配列のサイズは一定です(これは単なるメモリの塊です)。

別の変数で、配列の要素の数を自分で追跡する必要があります。

他の人が指摘しているように、最後の引数memsetは0に設定するバイト数である必要がありますがarray、これは単なるポインタであるため、sizeof(array)4(または64ビットプラットフォームでは8)しか生成されません。繰り返しになりますが、手動で渡す必要がありますsizeof(int) * 500(または、500の定数を使用して、変更された場合に複数の場所で番号を更新する必要がないようにします)。

于 2012-10-28T21:59:48.297 に答える
2

配列に動的に割り当てられたアイテムの数を取得する方法はありません。そのため、行memset(array, 0, sizeof(array))は配列内の500アイテムを0で埋めず、sizeof(array)常にに等しくなりsizeof(int*)ます。したがって、割り当てられたアイテムの数にアクセスしたい場合配列の場合は、サイズを含む別の値を使用するか、次のようなC++ストレージを使用する必要があります。std::vector

于 2012-10-28T22:00:59.123 に答える
2

動的memset()に割り当てられたメモリをクリアするのではなく、最初のバイトnew int[500]だけをクリアします。sizeof(int*)

ヒープメモリをクリアする場合は、次のようにします。

memset(array, 0, 500 * sizeof(int));

または初期化時:

int *array= new int[500]();
于 2012-10-28T22:06:16.010 に答える
0

www.cplusplus.com/faq/sequences/arrays/sizeof-array/も参照してください(sizeof()演算子について直接ではなく、一般的にC++で適切な「C++の方法」で配列を処理することについての良い読み物です。 )。

于 2012-10-28T22:13:12.013 に答える