2012-02-06 13 views
2

私はmain関数で2つの動的配列を作成しました。私は両方の関数を参照によって関数に渡しました。次に、小さなダイナミックアレイから大きなダイナミックアレイにデータをコピーします。小さなダイナミック配列を削除します。大きなダイナミックアレイのアドレスを小さなダイナミックアレイに割り当てます。今度は理想的にはarr配列のサイズは10でなければなりません。しかし、配列の6番目の要素をメインに印刷しようとするとクラッシュします。以下のコードを見てください:動的配列が関数に渡される

#include <iostream> 
#include <string> 

using namespace std; 

void func(string * arr, string * brr); 

int main()    
{ 
    string* arr = new string[5]; 
    arr[0] = "hello0"; 
    arr[1] = "hello1"; 
    arr[2] = "hello2"; 
    arr[3] = "hello3"; 
    arr[4] = "hello4"; 

    string* brr = new string[10]; 


    func(arr, brr); 

    for(int i = 0; i < 6; i++) 
     cout << arr[i] << endl; 

    return 0; 
} 

void func(string * arr, string * brr) 
{ 
    for(int i = 0; i < 5; i++) 
     brr[i] = arr[i]; 

    for(i = 0; i < 5; i++) 
     cout << brr[i] << endl; 

    delete []arr; 

    arr = brr; 

    arr[5] = "hello5"; 
} 

答えて

3

この行は、発信者のために絶対に何の効果もありません:だから呼び出した後

arr = brr; 

、それは前にポイントするために使用され、正確 arrポイント - (無効にしたため)無効なメモリ領域に移動します。

これがCの質問になる場合は、ポインタ(string **arr)へのポインタを使用することをお勧めします。しかし、私はこれがC++プログラムでは厄介だと感じています。どこかでリファレンスを使用したいと思うかもしれませんか?

+0

それがすべてではない嫌なのですが、あなたがしたい場合は、ポインタへの参照を使用することができるため、このシグネチャます:void funcを(文字列*&編曲、文字列* BRR) – Asaf

+0

@ Asaf私はC++を少ししか知っていませんが、私はいつも慣用的なC++がポインタを避けると考えていました。しかし、良い提案。 – cnicutar

+0

[これに関する良い記事](http://www.codeproject.com/Articles/4894/Pointer-to-Pointer-and-Reference-to-Pointer) – Samulk

0

@cnicutarは問題を正しく診断しました。呼び出し元が割り当てることのできるarrの新しい値を返すようにして、arrを参照渡し(配列ではなくPOINTERを参照)する必要があります。

+0

技術的には、前に参照でarrを渡していませんでした。ポインタを値渡ししていたためです(ポインタが変更されても関数の外では何の効果もありませんでした)。 &は参照渡しで、何にでも適用できます。 –

+0

ええ、私はそれを得ると思います。したがって、余分な&を追加することで、私が関数内で行う変更は、メインの "arr"配列にも影響します。どうもありがとう。実際にはかなり単純な修正です。私はこの問題を回避するためにかなりのコードを追加しました。 – Samulk

2

設定機能

void func(string * & arr, string * & brr) 
関連する問題