2017-04-21 32 views
0

ポインタの2次元配列へのポインタを返す関数を記述したいと思います。私は、この配列を持っている:ポインタの2次元配列

Organism** getWorldTab() { 
    return worldTab[20]; 
} 

それは正しいです:Organism* worldTab[20][20];と私の友人は、私は、このようにしたい関数を記述することをお勧め?私はこの(tempOrganism*** temp;である)を行いたい場合は:

*temp = world.getWorldTab(); 

Visual Studioは例外

Exception thrown: write access violation. 

    this->temp was 0xCCCCCCCC. 

をスローし、私はgetWorldTab()機能に問題があるかなり確信しています。

worldTab定義:それはいくつかの状況では、その最初の要素へのポインタに変換することができ、およびアレイへのポインタが完全にポインタへのポインタとは異なっているもののOrganism* worldTab[20][20];

+5

'worldTab [20]'は範囲外です。 –

+1

あなたはもっと文脈を与える必要があります。 'worldTab'はどこに定義されていますか? – tadman

+2

http://stackoverflow.com/help/mcveを読んで質問を編集してください – Sniper

答えて

1

アレイは、ポインタではありません。

あなたのアレイへのポインタのタイプはOrganism* (*)[20][20]です。

おそらくあなたの友人が思いついたものですが、タイプがOrganism* (*)[20]で、Organism**またはOrganism***ではなく、いずれかに変換できません。それが存在する20の第21の配列になるので

(そして、ボーナスとして、worldTab[20]が範囲外である。そして、あなたはアクセス違反の源である、*tempに割り当てる前にtempを初期化することはありません。 )

あなたは

Organism* (*getWorldTab())[20] { 
    return &worldTab[0]; 
} 

Organism* (*temp)[20] = getWorldTab(); 

または単に

Organism* (*temp)[20] = worldTab; 

を書くことができますが、私は思いますstd::vectorstd::arrayを使うことを学ぶべきです - 彼らは多くの苦痛を和らげます。
(さらに、それは2017です。面白いかもしれませんが、1969年のようにプログラムする必要はありません)