2010-11-21 18 views
1

単純な目的のために、2次元配列に行列を格納し、必要以上にメモリを消費しないC++コードはほとんどありません。これは、マトリクスに入れる前に、行列の各数値にメモリを割り当てる必要があることを意味します。2次元配列(行列)メモリ割り当ての問題

#include <cstdlib> 
#include <cstdio> 

using namespace std; 

int main() { 
    int ** matrix; 

    matrix = (int**)malloc(sizeof(int*)); 

    // Fill in the matrix 
    matrix[0] = (int *) malloc(3 * sizeof(int)); 
    matrix[0][0] = 5; 
    matrix[0][1] = 10; 
    matrix[0][2] = 15; 

    matrix[1] = (int *) malloc(3 * sizeof(int)); 
    matrix[1][0] = 2; 
    matrix[1][1] = 4; 
    matrix[1][2] = 6; 

    int i, n; 

    // Print the whole matrix 
    for (n = 0; n < 3; n++) { 
     for (i = 0; i < 3; i++) { 
      printf("%i\t", matrix[n][i]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

iは上記のコードをコンパイルし、それを実行すると、マトリックスを印刷するとき、それがクラッシュ:

3838セグメンテーション障害(コアダンプ)SH "$ {SHFILE}"

STACKDUMP次のようになります。

Exception: STATUS_ACCESS_VIOLATION at eip=0040126A 
eax=00000000 ebx=00B0021C ecx=00000000 edx=00000000 esi=6123DBAA edi=61179FC3 
ebp=0028CD18 esp=0028CCF0 program=C:\workspace\c\PA1_9\dist\Debug\Cygwin_4.x-Windows\pa1_9.exe, pid 3828, thread main 
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B 
Stack trace: 
Frame  Function Args 
0028CD18 0040126A (6123DBAA, 61179FC3, 0028CD58, 61006CD3) 
0028CD58 61006CD3 (00000000, 0028CD94, 61006570, 7EFDE000) 
End of stack trace 

私はポインタ/値を持ついくつかの問題があるだろうと思います...が、どこで、なぜ私は知らない...

+0

メモ:プログラムでメモリリークがあります。 – bjskishore123

+0

これは* NOT * C++です。 – rubenvb

+0

そうです!それはちょうど重大な悪いC + +です。 :P –

答えて

3

コードはほぼ正しいですが、行列の割り当てが間違っています。

matrix = (int**)malloc(2 * sizeof(int *)); 

外側の印刷ループが間違っている:3列の行列で唯一の2「行が」(あるあなたは二つの要素(matrix[0]matrix[1])を初期化しようとしながら、単一int *を保存するためのスペースを割り当てています各)。あなたがmatrix[2]にアクセスしようとするとプログラムがクラッシュします:

// Print the whole matrix 
for (n = 0; n < 2; n++) { 
    for (i = 0; i < 3; i++) { 
     printf("%i\t", matrix[n][i]); 
    } 
    printf("\n"); 
} 
+0

ああ、私はそれを見逃してしまった:-))ありがとうございます... –

+0

2Cream:私は答えを受け入れたいですが、私は質問を投稿してから7分後にそれを行うことができます.. 。少し待ってください:)) –

4

を使用すると、行列は3×3であることがわかっている場合は、なぜすべてのmallocの?簡単ではない理由:

int matrix[3][3]; 

これはメモリを自動的に解放するための処理です。 (freeをコードに忘れた!)

+0

彼はfree()を呼ぶのを忘れていませんでした。プログラムは 'return 0; ...無料で電話する必要はありません。 –