0

C を使用してファイルを読み取ると、奇妙な実行エラーが発生しました。エラー メッセージは、「実行時チェックの失敗 #2 - 変数 'delta_c' の周りのスタックが壊れています」です。私はビジュアルスタジオ2010を使用しています

これは、私がエラーを実行しているコードの簡略化されたバージョンです(この簡略化されたバージョンでも実行エラーが発生しました)

#include "stdafx.h"

typedef struct {
    unsigned short dx;  
    unsigned short dy;
    unsigned char  dr;  
    unsigned short ext; 
    unsigned char delta_c; 
} Delta;

typedef struct {
    unsigned char   region;     
    unsigned char   delta_num;  
    Delta       delta[8];   
} MNTDATSTRUCT;
int ReadAr(const char* mntfile, MNTDATSTRUCT *p)   
{
    FILE *fp = fopen(mntfile, "r");

    fscanf(fp, "%u",&p->delta_num);
    for (int i=0; i<p->delta_num; ++i) {
        unsigned short dx, dy, ext;
        unsigned char delta_c;
        fscanf(fp,"%u%u%u%u", &dx, &dy, &ext, &delta_c);
        p->delta[i].dx = dx;
        p->delta[i].dy = dy;
        p->delta[i].ext = ext;
        p->delta[i].delta_c = delta_c;

    }
    fclose(fp);
    return 0;
}

int main()
{
    MNTDATSTRUCT p;
    ReadAr("F:\\projects\\test_c++\\Debug\\tt.bpm",&p);
    return 0;
}

読み取る予定のデータ ファイル (tt.bpm) は次のようになります。

1 
1 2 10 13

何らかの理由で、構造体 Delta の一部のフィールドがデータ ファイル (unsigned char dr) に表示されないことに注意してください。構造体 MNTDATSTRUCT の unsigned char 領域にも

コードを実行しようとすると、Visual Studio が 33 行目 (ReadAr から 0 を返した直後) で停止し、ランタイム エラー メッセージが表示されます。 "、しかし、ウォッチ ウィンドウでは、MNTDATSTRUCT *p はプロパティが入力されています。

この状況が気になります。誰か私にいくつかの提案をしてもらえますか?

助けてくれてありがとう。

4

1 に答える 1

0

hshort intの修飾子を追加して、 hhchar を使用する必要があります。

fscanf(fp, "%hhu",&p->delta_num);
…
fscanf(fp,"%hu%hu%hu%hhu", &dx, &dy, &ext, &delta_c);
于 2013-01-08T09:36:37.760 に答える