3

次のことを実行しようとすると、保護されたメモリに対して読み取りまたは書き込みを行おうとしているというエラーが表示されます。

void func1(int * ptr) {
    int *ptr_b = new int[5];
    ptr = ptr_b; 
}

void main() {
    int *ptr_a;
    func1(ptr_a);
    delete [] ptr_a;
}

これは合法ですか?

4

3 に答える 3

9

いいえ。あなたはよくある初心者の間違いを犯しています。ポインタへの参照またはポインタを要求しない限り、ポインタが値によって渡される単なる変数であることを覚えていません。関数のシグネチャを次のように変更しますvoid func1(int *& ptr)

于 2012-05-07T16:29:19.340 に答える
7

署名を次のように変更します。

void func1(int *& ptr)

ポインタを値で渡しているので、外側ptrは変更されません。だからそれはするようなものです

int main() {  // <--- main returns int
    int *ptr_a;
    delete [] ptr_a;
}

ptr_a初期化されていないため、これは不正です。

于 2012-05-07T16:29:06.050 に答える
4

ポインタをで渡しました。これは、関数が機能するポインターが呼び出し元のポインターのローカルコピーであることを意味します。そのため、関数で割り当てた値は、呼び出し元には表示されません。

関数がローカルコピーに割り当てるのではなく、呼び出し元のポインターに割り当てることができるように、代わりに参照によって渡します。

void func1(int* &ptr)

または、新しく割り当てられたポインタを返すことを検討してください。

int* func1()
{
    return new int[5];
}

私は後者のアプローチを好みます。

于 2012-05-07T16:29:58.223 に答える