0

sizeof() に問題があります。以前に作成したクラスにポインターがあります。そして、このポインタは次のように初期化されます

 static Book* books;

したがって、何も意味しません。ポインターが配列を指しているかどうかを判断したい。したがって、最初の質問は、実行時にこのポインターのアドレスを変更して配列を指すことができるため、それを行うための解決策は何かということです。sizeof(pointer) を使用しようとしましたが、十分に役に立ちません。戻り値は 4 です。このように、何かを参照しているかどうかを評価できます。

これは私のクラスです:

class Tool
{

private:
    static Book* books;

public:

    static char* pgetStringIntoArray(string);
    static string* pgetStringFromArray(char*);
    static void printCharArray(char*);
    static bool* addBook(Book*);
    static bool* isStored(Book*);
};

そして、これは問題のある方法です:

bool* Tool::isStored(Book* book)
{
    bool* stored = new bool(false);
    if(Tool::books)
    {
        cout << "NULL"  << endl;
    } else {
        return stored;
    }

}
4

3 に答える 3

4

sizeofいいえ、ポインターが何かを指しているかどうかを判断するために使用することはできません。sizeofポインターは、同じアーキテクチャーでは常に同じサイズになります。

あなたはこれを行うことができます:

Tool::Book* books = NULL;

そして、有効な非 null 値を指しているかどうかを確認したい場合は、次のようにします。

if (Tool::books) {
    // books is pointing to something
}

ポインター (配列) にメモリを割り当てるたびに、割り当てが成功すると、ポインターは null ではなくなります。を使用しているため、配列 (ポインター) の代わりに動的次元の配列を保持するためにC++使用することを検討してください。std::vector

于 2012-08-25T16:24:16.580 に答える
1

あなたの問題は、よりもポインターを理解することにありますsizeof

sizeofコンパイル時の操作です。ポインターの場合、常に返さsizeof(void*) れます (ほとんどの 64 ビット アーキテクチャでは 8 バイトです)。VLAを除き、コンパイル時の定数をsizeof返します。

Cは、ポイントされたゾーンの使用サイズを知りません-例としての結果をmalloc考えてください-(ポインター演算を実行できるため)。必要に応じて自分で管理する必要があります。

于 2012-08-25T17:25:10.683 に答える
1

C と同様に、C++ は静的に型付けされsizeofます。演算子によって返されるさまざまな型のサイズは、コンパイル時に決定され、変更されません。

あなたが求めていることを行う適切な方法は、ポインターを初期化NULLし、後でそれを確認することです。NULLは有効なメモリ アドレスを参照しないことが保証されているため、存在しないポインター ターゲットの適切なマーカーになります。とにかく、ポインターを初期化することは良い習慣です。初期化されていないポインターを逆参照することによる潜在的な問題、せいぜい厄介なメモリエラーを引き起こす問題からあなたを救います。

はい、残りの変数を明示的に初期化することも良い考えです...

編集:

それほど些細なことではありませんが、C および C++ プログラムの static フィールドは、実行可能ファイルの特別なセクション ( BSSなど) に格納され、プログラムのロード時に自動的にゼロに初期化されます。したがって、静的ポインタを明示的に初期化する必要はありませんNULL。それはすでにあなたのために行われています...

于 2012-08-25T16:27:14.960 に答える