2011-09-15 21 views
0

ここでの目的は、2次元マトリックスのように機能するポインタを持つことです。私は、ポインタと整数ポインタの配列を作成するためのコードの次のビットをテストしました。コンパイルして正常に動作します。 (これは簡易版ですが、私はmymatrix[x][y]に/印刷値を代入しようとしました、それが正常に動作します。)ポインタの配列へのポインタによるセグメンテーションフォールトとメモリ破損

#include <iostream> 
int **mymatrix; 

int main(int argc, char* args[]){ 

    mymatrix = new int*[100] ; 
    for(int n = 0; n <= 100; n++){ 
    mymatrix[n] = new int[200] ; 
    } 
    return 0; 
} 

をしかし、できるだけ早く私は(以前に細かい走った)別のコードに、このスニペットをコピーして、コードはまだコンパイルされますが、実行に失敗します。このスニペットに関連するエラーや警告はありません。 mymatrixは、コードの残りの部分とまだ対話していない(定義された後は、もう一度使用されることはない)ので、これは奇妙です。

実際に実行を中断するエラーは、フォントを読み込もうとしたときにクラッシュするときと、値を割り当てようとしたときにSegmentation Faultとなり、スレッドとして大量のログ出力を持つMemory Corruptionです。

大きなコードのセクションを貼り付けることができましたが、私はこのポインタが適切な方法で定義されていないため、これがすべて起こっているとほとんど確信しています。不器用で不器用なことをやっていますか?あるいは、残りのコードをバグに目を通す必要がありますか?

答えて

2
for(int n = 0; n <= 100; n++) 

これは、配列のオーバーランを引き起こします。 mymatrix [100]は、mymatrix配列の一部ではありません。それへの書き込みの結果は未定義です。それが "うまく機能する"理由は、あなたが壊すための他のデータ構造がないということです。 forループは、で始まる必要があります。

for(int n = 0; n < 100; n++) 

一般に、ループ条件のため< =での使用は、慣用Cはありません。あなたがそれを使用していると分かっている場合は、あなたが本当に正しいことをしているかどうかを尋ねるべきです。アレイオーバーランは時々見つけにくいことがあります。 Linuxの場合は、valgrindのようなツールを使用して、このエラーやその他のエラーを特定するのに役立ちます。

+0

うわー、コード全体で配列の定義が間違っていました。私は誓うことができました[5]私に0から5の配列を与えました=) – Malabarba

関連する問題