2

私は、C で ASCII ゲーム エンジンを作成し、C++ でプログラムを書いて練習するために見つけたいくつかのチュートリアルに取り組んでいます。私は現在、イメージ構造体 (int 幅、int 高さ、および char の配列を保持するヒープ上の場所への 2 つの char ポインターを含む [幅 * 高さ] の形式でヒープに画像データを割り当てる作業を行っています。 size)... ただし、新しい演算子の呼び出しに問題があります。構造体自体、およびその文字と色のデータにメモリを割り当てる関数は、次のようになります。

Image *allocateImage(int width, int height) {

Image *image;
image = new Image;

if (image == NULL)
    return NULL;

image->width = width;
image->height = height;
image->chars = new CHAR[width * height];
image->colours = new COL[width * height];

//image->colours = (CHAR*) PtrAdd(image->chars, sizeof(CHAR) + width * height);

for (int i = 0; i < width * height; ++i) { //initializes transparent image
    *(&image->chars + i) = 0;
    *(&image->colours + i) = 0;
}
return image;
}

メイン関数自体 (この関数が 2 回呼び出される場所) は次のようになります。

int main() {
int x, y, offsetx, offsety;

DWORD i;

srand(time(0));

bool write = FALSE;

INPUT_RECORD *eventBuffer;

COLORREF palette[16] =
  {
        0x00000000, 0x00800000, 0x00008000, 0x00808000,
        0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0,
        0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00,
        0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff
  };

COORD bufferSize = {WIDTH, HEIGHT};

DWORD num_events_read = 0;

SMALL_RECT windowSize = {0, 0, WIDTH - 1, HEIGHT - 1};

COORD characterBufferSize = {WIDTH, HEIGHT};
COORD characterPosition = {0, 0};
SMALL_RECT consoleWriteArea = {0, 0, WIDTH - 1, HEIGHT - 1};

wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
rHnd = GetStdHandle(STD_INPUT_HANDLE);

SetConsoleTitle("Title!");
SetConsolePalette(palette, 8, 8, L"Sunkure Font");

SetConsoleScreenBufferSize(wHnd, bufferSize);
SetConsoleWindowInfo(wHnd, TRUE, &windowSize);

for (y = 0; y < HEIGHT; ++y) {
    for (x = 0; x < WIDTH; ++x) {
        consoleBuffer[x + WIDTH * y].Char.AsciiChar = (unsigned char)219;
        consoleBuffer[x + WIDTH * y].Attributes = FOREGROUND_BLUE;
    }
}

write = TRUE;

Image *sun_image = allocateImage(SUNW, SUNH);
Image *cloud_image = allocateImage(CLOUDW, CLOUDH);
setImage(sun_image, SUN.chars, SUN.colors);
setImage(cloud_image, Cloud.chars, Cloud.colours);

誰かが必要だと感じた場合は、さらにコードを投稿できますが、プログラムはこのポイントに到達するだけです。実際には、関数内の new 演算子が呼び出されるポイントで、allocateImage への 2 回目の呼び出しでクラッシュするため、その少し前です。この時点まで、プログラムは問題なく動作していました。最近追加されたのは、ヒープ上に画像データを割り当てる関数 (可変サイズの画像を作成するため) と、割り当てを解除する関数 (このプログラムでは到達しません) だけです。 . 私が学んでいるプログラムは C で書かれているので、これはソース コードを見ても役に立たない場所の 1 つであり、Google もあまり役に立ちませんでした。誰が何が問題なのか教えてもらえますか?

4

1 に答える 1

5

これらの行

*(&image->chars + i) = 0;
*(&image->colours + i) = 0;

imageはすでにポインターであるため、疑わしいです。ポインターへのポインターは、ここでは意味がありません。を削除するだけ&です。

実際のコードは Joe Random Address に書き込むため、何かが起こる可能性があります。newそのため、メモリ サブシステムを妨害して次の呼び出しを妨害することは珍しくありません。

于 2013-07-07T08:49:03.557 に答える