我最近在调试代码时遇到了一个奇怪的错误。我的结构看起来像这样:
typedef struct
{
uint8 val1;
uint16 val2;
uint8 val3;
uint8 val4;
uint16 val5;
uint8 val6;
} foo;
其中uint8
和uint16
分别定义为unsigned char
和unsigned 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
的定义中切换val2
和foo
来修复错误。我不明白的是为什么这首先出现了。
我猜它与对齐有关,但如果有人能够对第一种情况下究竟发生了什么进行一个很好的解释,我真的很感激。
答案 0 :(得分:1)
将指向8位变量(val1)的指针传递给具有32位类型格式说明符的scanf会导致fscanf写入变量的末尾,因此会覆盖相邻成员的顶部(s) )结构(val2和val3)。
%u是无符号整数,因此scanf()认为它有一个4字节地址来存储其值。相反,它可能会将数据写入另外两个变量的内存地址。