2016-12-30 9 views
2

元画像の幅と高さを倍にして、テンポラリ画像を作成して4倍の画像を作成しようとしています。元の画像上の各ピクセルからの情報を取得し、それを一時画像の4ピクセルに渡します。 このようなものです。一時画像にCのピクセルレベルで画像を大きくしようとすると、0xCDCDCDCDのアクセス違反が発生する

[1] [2]

[3] [4]

オリジナル画像

[1] [1] [2] [2 ]

[1] [1] [2] [2]

[3] [3] [4] [4]

[3] [4] [4]

ただし、アクセス違反の書き込み場所は0xCDCDCDCDです。ここ は私の機能コードです:違反に

void makeBigger(Image* plain) 
{ 
Image temp; 

temp.height = plain->height * 2; 
temp.width = plain->width * 2; 

temp.pixels = (Pixel**)malloc(sizeof(Pixel*) * temp.height); 
for (int i = 0, k = 0; i < temp.height; i+2, k++) 
{ 
    temp.pixels[i] = (Pixel*)malloc(sizeof(Pixel) * temp.width); 
    for (int j = 0, g = 0; j < temp.width; j+2, g++) 
    { 
     temp.pixels[i][j].r = plain->pixels[k][g].r; 
     temp.pixels[i][j+1].r = plain->pixels[k][g].r; 
     temp.pixels[i+1][j].r = plain->pixels[k][g].r; 
     temp.pixels[i+1][j+1].r = plain->pixels[k][g].r; 

     temp.pixels[i][j].g = plain->pixels[k][g].g; 
     temp.pixels[i][j+1].g = plain->pixels[k][g].g; 
     temp.pixels[i+1][j].g = plain->pixels[k][g].g; 
     temp.pixels[i+1][j+1].g = plain->pixels[k][g].g; 

     temp.pixels[i][j].b = plain->pixels[k][g].b; 
     temp.pixels[i][j+1].b = plain->pixels[k][g].b; 
     temp.pixels[i+1][j].b = plain->pixels[k][g].b; 
     temp.pixels[i+1][j+1].b = plain->pixels[k][g].b; 
    } 
} 

*plain = temp; 

} 

は、ときにプログラムブレークとエラー表示されていることがあるように、ライン

temp.pixels[i+1][j].r = plain->pixels[k][g].r; 

に発生するようです。 この違反の原因とは何ですか?これを解決するには何ができますか?

+5

'for(int i = 0、k = 0; i

+0

デバッガでコードをステップ実行するまでの時間。 –

+0

"行に違反が発生しているようです"は有用な情報ではありません。違反が発生したときに、その行のi、j、k、gの値が役立ちます。それらを印刷してください。 – Elan

答えて

4

反復ごとに外側のループ、内側:

  • あなたはあなたがにしようtemp.pixels[i]
  • が指すメモリブロックに書き込みをしようとすると、適切に割り当てられたメモリブロック
  • を指すようにtemp.pixels[i]を初期化しますtemp.pixels[i+1]

しかし、を初期化していないのでが適切に割り当てられたメモリブロックを指し示すために、この変数を使用してメモリにアクセスしようとすると、メモリアクセス違反(またはより一般的には未定義の動作)が発生します。

+0

@Stargateur:はい、そうです。どちらの場合でも、OPはまずtemp.pixels [i + 1]を使用します。 –

+0

ありがとうございます! @DavidBowlingが言ったように、現在は動作しています。私はi + 2も忘れています(彼にも感謝!)。 – zaylan

+0

@Stargateur:どちらの場合でも、少し一般的にしました。それを指摘してくれてありがとう:) –

3

マジック値0xCDCDCDCDは、あなたが初期化されていないヒープメモリをアクセスしている示しています

0xCDCDCDCD:初期化されていないヒープメモリに

をマークするために、MicrosoftのC++のデバッグランタイムライブラリで使用される具体的には、あなたがいることを読んでいます値をヒープ上のポインタから取得し、逆参照しようとすると、不正なメモリアクセスが発生します。

MSVCで使用されるより多くのマジック値については、In Visual Studio C++, what are the memory allocation representations?を参照してください。

+0

マイクロソフトはいくつかの良いトリックを持っています。知っておいてよかった。 – Stargateur

関連する問題