2012-03-12 8 views
2

先ず、私はnewがこれを行うC++の方法であることを知っています。私は、単にこのエラーを再現する方法が複数あることを示しています。両方とも信じられないほどイライラしています。なぜデバッガは配列ポインタの要素を1つだけ表示しますか?

私はこのソースファイルに2つの形式があります。私はまだ別のプログラミング課題をデバッグしようとしていますが、私はそれについての助けを求めていません。基本的には、サイズのフィールドとint配列へのポインタを持つクラスとしてsetを再実装しようとしています。ここでnewを使用したコードは次のとおりです。あまり望ましいalloc機能使用

testnew.cpp

int main() 
{ 
    int size = 1; 
    int *elements = new int[size]; 
    elements[0] = 0; 
    size++; 
    int * temp = new int[size]; 
    for (int i = 0; i < (size - 1); i++) 
    { 
     temp[i] = elements[i]; 
    } 
    delete[] elements; 
    temp[size] = size; 
    elements = temp; 
    elements[1] = 1; 
    delete[] elements; 
} 

と再び、:いずれの場合も

testalloc.cpp

int main() 
{ 
    int size = 1; 
    int * elements = (int *) malloc(sizeof(int) * size); 
    elements[0] = 0; 
    size++; 
    elements =(int *) realloc(elements,size * sizeof(int)); 
    elements[1] = 1; 
    free(elements); 
} 

を、私目的は、配列を作成して、配列に追加することです。しかし、どちらの場合でも、Visual Studio 2010でビルドして実行した後、は配列がまったく拡張されず、に入る項目が1つしかありません。 VSのデバッガでは、elementsの配列ポインタを監視しています。添付されたスクリーンショットです。両方のバージョンのコードで同じです。

My watches at the end of the program

- ブレークポイントはdelete[]/free()コールです。

真剣に、私は間違っていますか?これは論理エラーでなければならず、私はmalloc/reallocnewの四十ダースの例を梳き、私の教科書を読んで再読んで、何が間違っているのか分かりません!

割り当てられたメモリを配列に分割する行があるように感じますが、new int[]呼び出しでは行えません。

答えて

1

ファイルtestnew.cpptempsize要素にメモリを割り当てその後size+1要素である、temp[size]を設定します。

elements =(int *) realloc(elements,size * sizeof(int)); 

reallocが失敗した場合、elementsがに設定されます。おそらくこれは、ファイルtestalloc.cppreallocにthte呼び出しが成功したことを確認することなく、同じ変数にメモリを再割り当ての一般的なエラーを犯し

temp[i] = size; 

する必要がありますnullの場合、元のメモリは孤立します。

2

は、最初の例では、これは間違っている:これはに変換されます

temp[size] = size; 

temp[2] = 2; 

と配列があるので、あなたが割り当てられた領域の外側に書いているゼロをインデックス。

+0

Ah!ゼロインデックス付けを呪う。それは私の問題に終わってしまいました。私はそれがわかっていましたが、デバッガで私の経験が無かったので私を捨てました。 – Tasuret

4

他の回答があなたのコード(temp[size] = size;)のバグを指摘していますが、デバッガの出力を誤って読んでいるという混乱が生じています。

タイプシステムとデバッガに関する限り、elementsは配列ではなく、ポインタです。デバッガには、配列内の最初の要素へのポインタか単一の要素へのポインタかを知る方法がありません。

elements[x]の値をデバッガに表示する場合は、式*(elements+x)を使用します。

+0

あなたは 'elements [x]'をデバッガに置くこともできます。 – crashmstr

+0

これはまさにこれです。あなたのロジックは大丈夫です、それは誤解されている出力です。 –

1

最初にC++は0のインデックスが付けられているため、temp[size] = size;は1つのエラーによってオフになります。あなたの質問に答えるために、要素のタイプはint*です。実際に配列であることは、コード解析なしでVSに利用できる知識ではありません。したがって、あなたがする必要があるのは、たとえばstd :: vector <>、boost :: arrayを使用するか、または配列がint*に決して害されないことを確認することです。コードと

5

のほかに、他の問題、あなたはJoe Gauterinは言及何と複数の時計を持っている、またはこのよう時計を設定する必要があり、次のいずれか

enter image description here

elements,5 

になります

VS2010用に更新されたリストがあるかどうかわかりませんが、まだ動作していますが、これはまだ動作しています: Symbols for Watch Variables
And: View array in Visual Studio debugger?

+0

+1の要素、5 ' - 私はあなたがそれを行うことができるか分からなかった –

関連する問題