fscanf和结构对齐

时间:2014-07-15 04:22:39

标签: c++ c

我最近在调试代码时遇到了一个奇怪的错误。我的结构看起来像这样:

typedef struct
{
    uint8  val1;
    uint16 val2;
    uint8  val3;
    uint8  val4;
    uint16 val5;
    uint8  val6;
} foo;

其中uint8uint16分别定义为unsigned charunsigned short int。我试图使用fscanf从制表符分隔的文本文件进行扫描。代码是这样的:

foo f;
FILE* fptr = fopen("test.txt", "r");

if (fptr == NULL)
{
    printf("Error opening file");
    return;
}

if (6 == fscanf(fptr, "val2=%hu\t"
    "val1=%u\t"
    "val3=%u\t"
    "val4=%u\t"
    "val5=%hu\t"
    "val6=%u", &f.val2, &f.val1, &f.val3, &f.val4, &f.val5, &f.val6))
    {
        //Some other code
    }
    else
    {
        printf("Error");
    }
    fclose(fptr);

在调试时,无论我使用什么格式说明符或在文本文件中输入的内容,我发现val2中存储的值都是0。我设法通过在val1的定义中切换val2foo来修复错误。我不明白的是为什么这首先出现了。

我猜它与对齐有关,但如果有人能够对第一种情况下究竟发生了什么进行一个很好的解释,我真的很感激。

1 个答案:

答案 0 :(得分:1)

将指向8位变量(val1)的指针传递给具有32位类型格式说明符的scanf会导致fscanf写入变量的末尾,因此会覆盖相邻成员的顶部(s) )结构(val2和val3)。

%u是无符号整数,因此scanf()认为它有一个4字节地址来存储其值。相反,它可能会将数据写入另外两个变量的内存地址。