0

私は、C++のフロートの連続したメモリブロックを操作しようとしています。メモリは、私が使用している独自の画像ライブラリのピクセルデータを表します。ライブラリが作成ルーチンの最初のfloatへのポインタを取得するという事実を変更することはできません。たとえば、20x20の画像は、400個の連続したフロートとしてメモリに保持されます。

以下のように、私はこのメモリのポピュレーションをテストするためにループを使用しています。

ループが繰り返されるたびにポインターをインクリメントしていますが、実行時にアクセス違反が発生しています。明らかに、どういうわけかヒープをオーバーランしています。ポインタを正しくインクリメントしていないか、これを誤解しているのではないかと心配しています。

どこが間違っているのですか?私はこれに新鮮な目が走ったことを感謝します:)ありがとう

int width = 500;
int height = 500;
float *img = (float*) calloc(width * height, sizeof(float));

int count = 0;
while (count < (width * height))
{
    *img = 1.0f;
    count++;
    img++;
}

saveImage(width, height, img, TEXT("test.tiff"));

free(img);
4

2 に答える 2

4

ループ内でimgを変更しています。saveImageを呼び出すと、imgポインターは画像の最初ではなく、画像の最後の後にあります。

于 2013-03-24T23:47:41.463 に答える
3

ループが繰り返されるたびにポインターをインクリメントしています。

そしてそれが問題です。予想imgどおり、画像の先頭を指さなくなりました。に渡って移動するとsaveImage確信しているので、割り当てたメモリの境界を超えて実行されます。 saveImageimgimg + (width * height - 1)

一時的なポインタまたはインデックスを使用します。

int count = 0;
while (count < (width * height))
{
    img[count] = 1.0f;
}

saveImage(width, height, img, TEXT("test.tiff"));
free(img); // and now this is correct as well
于 2013-03-24T23:47:30.613 に答える