2

関数にメモリを割り当てようとしていますが、何が間違っているのかわかりません。これ欲しい:

int main()
{
    int* test= 0;
    initialize(test, 10);
    int test2 = test[2];
    delete[] test;
}

void initialize(int* test, int count)
{
    test = new int[count];
    for (int i = 0; i < count; i++)
    {
        test[i] = i;
    }
}

しかし、次のエラーが表示されます: Robust Simulation.exe の 0x770d15de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000008。次の行で中断します: int test2 = test[2];

しかし、これは機能します:

int main()
{
    int* test=0;
    test = new int[10];
    for (int i = 0; i < 10; i++)
    {
        test[i] = i;
    }

    int test2 = test[2];
    delete[] test;
}

スコーピングの問題はありますか?ポインターを渡すと割り当てられ、初期化関数の外でアクセスできると思いました。

ご協力いただきありがとうございます

4

3 に答える 3

2

次の変更を行います:-

initialize(&test, 10);
....


void initialize(int** test, int count) 
{
     *test = new int[count];
     for (int i = 0; i < count; i++)
     {         (*test)[i] = i;     }
 }

C++には、必要に応じて参照と呼ばれる別の機能があります:-

void initialize(int*& test, int count)
{
         test = new int[count];
         for (int i = 0; i < count; i++)
         {         test[i] = i;     }
}

あなたがやっていることは、テスト[メインから](アドレスが渡されます)を渡し、テストという名前の別のローカルポインター変数に格納することです。この新しい変数は関数スコープの有効期間を持ち、関数の完了後にゴミを残してすぐに削除されます。

別のオプションは

int* test= initialize(test, 10);

初期化を次のように変更します

int* initialize(int* test, int count)
    {
             test = new int[count];
             for (int i = 0; i < count; i++)
             {         test[i] = i;     }
           return test;
    }
于 2012-08-30T15:05:24.067 に答える
2

ポインターも値によって渡されます。必要なもの:

void initialize(int*& test, int count)

あなたのバージョンは元のポインタを変更しません:

void initialize(int* test, int count)
{
    //test is a copy of the pointer because it was passed by value
    //...
}

delete[]この後、失敗する理由は明らかです。元のポインターmainが初期化されていないためです。

于 2012-08-30T15:00:44.417 に答える
1

ポインターへの参照をinitialise関数に渡す必要があります。プロトタイプを

void initialize(int* &test, int count) 

の戻り値は、値渡し時に作成されるポインターのコピーnewに割り当てられます。したがって、関数が終了すると、コピーが範囲外になるとそのアドレスが失われ、メモリ リークが発生します。したがって、ポインタが実際に割り当てられたメモリを指すことはないため、ポインタを削除するとアクセス違反が発生します。test

参照渡しにより、testポインタを関数で変更できます

于 2012-08-30T15:01:37.007 に答える