web-dev-qa-db-ja.com

C ++で空の整数配列を初期化する方法

整数配列にNULLまたは空の値を入れる方法は?

struct book{
char name;
char aut;
int det[10];
};
book bk[40];

ここで、すべての本のデータ型にdet配列を持たせて、すべてのdet []メンバーの値がゼロになるようにします。

7
nikhil

私はあなたが整数配列をゼロ初期化する方法を意味すると思います。:)

次のように配列を定義できます

int det[10] = {};

または

int det[10] = { 0 };

このような宣言を構造体で使用できます。

配列がすでに定義されている場合は、memsetを使用できます。例えば

#include <cstring>

//...

std::memset( det, 0, sizeof( det ) );
9

あなたはしません。

配列detは10個の要素で構成され、各要素はintのオブジェクトです。配列の長さは作成後は変更できず、各要素にはsomeintの値が含まれます(または、初期化されていない場合は未定義のガベージが含まれます)。

ポインター型の場合、何も指し示さず、何かのアドレスであるすべてのポインター値とは異なる特別な「nullポインター」値があります。

タイプintに対応する「null」または「空」の値はありません。 0は完全に有効なint値です。

有効な要素と無効な要素を追跡したい場合は、他の方法を使用する必要があります。たとえば、無効なエントリを示す値を任意に選択する場合があります。必要に応じて、この目的で0を使用できますが、0を有効なエントリとして使用することはできません。または、意味のある値と競合する可能性が最も低いINT_MIN、最も負のint値を使用できます。ただし、選択した特別な値に常に注意を払うようにコードを記述する必要があります。

または、std::vector <int>など、長さを変更できる別のデータ構造を使用することもできます。どのデータ構造を使用するかは、達成しようとしていることに依存しますが、これは質問からは明らかではありません。

3
Keith Thompson

C++ 11は、オブジェクトの構築中に配列を初期化するセマンティクスを変更しました。それらをctor初期化子リストに含め、空の括弧または括弧で初期化することにより、配列の要素はデフォルトで初期化されます。

struct foo
{
    int x[100];

    foo() : x{} {}
};

この場合、foo:xの各要素はゼロに初期化されます。

C++ 11を使用していない場合は、std::memsetを使用してコンストラクター本体の配列の要素を初期化できます。

struct foo
{
    int x[100];

    foo()
    {
        std::memset(x, 0, sizeof(x));
    }
};
1

Int配列の場合は、nullではなく0に初期化する必要があります。

int det[10] = { 0 };

文字列配列の場合は、要素をnullに初期化しますが、intの場合は初期化しません。

1
user2649644