配列へのポインターに対して memset を実行するにはどうすればよいですか?
int (*p)[2];
p=(int(*))malloc(sizeof(*p)*100);
memset(p,0,sizeof(*p)*100);
この割り当ては正しいですか?
を使用できますcalloc
。
calloc
malloc
との両方を置き換えmemset
ます。
p = calloc(100, sizeof (*p));
エレガントな方法:
typedef int int_arr_2[2];
int_arr_2* p;
p = malloc(sizeof(int_arr_2)*100);
memset(p,0,sizeof(int_arr_2)*100);
一番いい方法:
typedef int int_arr_2[2];
int_arr_2* p;
p = calloc(100, sizeof(int_arr_2));
callocは、mallocとは異なり、すべてのバイトがゼロに設定されることを保証します。
私は多くの答えを要約します(ただし、私自身の好みを支持して、文体のバリエーションのいくつかを無視しました).
C:
malloc の使用方法:
int (*p)[2] = malloc(100 * sizeof(*p));
memset の使用方法:
memset(p, 0, 100 * sizeof(*p));
1 つのステートメントで両方を行う方法:
int (*p)[2] = calloc(100, sizeof(*p));
malloc
C++ では、 and calloc
:の結果をキャストする必要があることを除いて、同じことが可能ですstatic_cast<int(*)[2]>(std::malloc(100 * sizeof(*p))
。
ただし、C++ では、これを割り当てる別の方法が提供されています。
int (*p)[2] = new int[100][2](); // like calloc.
delete[] p; // *not* delete p
C++ も を提供しますvector
。これは通常は便利ですが、残念ながら C スタイルの配列のベクトルを作成することはできません。C++03 では、次のように回避できます。
struct my_array {
int data[2];
};
std::vector<my_array> p(100);
// no need to free/delete anything
間違っているかもしれませんが、それで要素がゼロになるとは思いません。私が正しければ、ゼロにする必要があります:
my_array initvalue = {0};
std::vector<my_array> p(100, initvalue);
2 つの int を表す別の方法:
std::vector<std::pair<int,int> > p(100);
ブーストを使用できる場合:
std::vector<boost::array<int, 2> > p(100);
C++11 の場合:
std::vector<std::array<int, 2>> p(100);
これらを通常の優れたものから順にリストしたので、作業中の制約によってブロックされていない最後のものを使用してください。たとえば、内側の arrays-of-2-int の 1 つの最初の要素へのポインターを取得し、それをインクリメントして 2 番目のポインターを取得することを期待している場合、それstd::pair
が機能することを保証しないため、アウトです。
memset()
線は適切です。
Cの場合、mallocキャスティングは必要ありません。
C ++では、これを実行したい場合は、型キャストは次のようになります。
p = (int(*)[2]) malloc(sizeof(*p)*100); // or `static_cast<...>
// ^^^^^^^^^
std::vector
ただし、代わりに使用する方法を変更することをお勧めします。よりクリーンで、より優れた「半自動」:
std::vector<int*> vi(100); // or std::vector vi(100, nullptr);
生のポインタを使用する別の方法は、以下を使用することnew[]
です。
int **p = new[100](); // allocates and sets to 0
ただし、後で割り当てを解除して、このメモリを管理する必要があります。delete[]
C(C++ではない)では、あなたはただやります
int (*p)[2] = malloc(sizeof(*p)*100);
memset(*p,0,sizeof(*p)*100);
つまり、変数は式で初期化でき、キャストは必要ありmalloc
ません (キャストする必要もありません)。次に*p
、に渡されたときにポインターに減衰する配列型の「左辺値」ですmemset
。