2016-05-13 6 views
0

Iは、mallocを使用して、それらにベクター画像のいくつかの値を割り当てる(MATRmatGMATB)は、3つの行列を割り当てています。 いつものように、私はこの仕事のためのループを作るために2つの整数(i、j)を使っています。最初にi = 0、j = 0とすると、197にmatR [0] [0]を、matG [0] [0]に211を、matB [0] [0]に219を代入します。今まではOKです。それらは私が望む価値です。しかし、ここでは奇妙な振る舞いが起こります:いくつかの点で新しい値がmatR [0] [0]、matG [0] [0]、matB [0] [0]に割り当てられます!奇妙な行動マトリックス(C/C++)に値を割り当てる

これは私が言ったことをやっているコードの一部です:

int i, j, k; 
std::vector<unsigned char> image; //the raw pixels 
unsigned error = lodepng::decode(image, width, height, filename); 

matR = (unsigned char**)malloc(sizeof(unsigned char)*width); 
matG = (unsigned char**)malloc(sizeof(unsigned char)*width); 
matB = (unsigned char**)malloc(sizeof(unsigned char)*width); 

k=0; 
for(i=0; i<width; i++) { 
    matR[i] = (unsigned char*)malloc(sizeof(unsigned char)*height); 
    matG[i] = (unsigned char*)malloc(sizeof(unsigned char)*height); 
    matB[i] = (unsigned char*)malloc(sizeof(unsigned char)*height); 

    for(j=0; j<height; j++) { 
    matR[i][j] = image[k++]; 
    matG[i][j] = image[k++]; 
    matB[i][j] = image[k++]; 
    k++; //separator 
} 

私は、コードをdebbugするいくつかの行を追加して、端末上で実行されている、私は次の出力を得た: http://imgur.com/XvQIGYk

* i = 100、j = 0のとき、matR [0] [0]の値が176に変更されたことを示します。

何が起こっていますか?

答えて

2

このライン:

matR = (unsigned char**)malloc(sizeof(unsigned char)*width); 

は次のようになります。

matR = (unsigned char**)malloc(sizeof(unsigned char *)*width); 
// Note here          ^

あなたはwidth文字、ないwidthポインタのための部屋を割り当てています。おっとっと。

std::vector<std::vector<char>> matR(width, std::vector<char>{height}); 

(存在行列クラスを書くことのより良い方法がありますが、これはあなた自身のmallocを行うよりも優れています。):あなたが書いていない理由をc++でこれをタグ付けしていることを考えるしかし

、 allocaを

matR = (unsigned char**)malloc(sizeof(unsigned char)*width); 

matRunsigned char*の配列ですが、あなただけだ:

2

問題は、このような行でありますそれはunsigned charの配列と同じくらい大きいと解釈します。これは実際にポインタを格納するのに必要なメモリ量より4〜8倍少ないメモリを割り当て、割り当てられた内部配列が誤って指すようにします。