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 的某些字段未显示在数据文件(无符号字符博士)上。也适用于 struct MNTDATSTRUCT 中的无符号字符区域

当我尝试运行代码时,Visual Studio 将停止在第 33 行(就在从 ReadAr 返回 0 之后),并弹出运行时错误消息:运行时检查失败 #2 - 变量“delta_c”周围的堆栈已损坏。 ",尽管在监视窗口中,MNTDATSTRUCT *p 已被属性填充。

我很好奇这种情况。谁能给我一些建议?

感谢您的帮助。

4

1 回答 1

0

您需要h为短整数添加修饰符并使用hh字符。

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