Fscanf和结构对齐
fscanf and structure alignment
我最近在调试代码时遇到了一个奇怪的bug。我有一个像这样的结构:
typedef struct
{
uint8 val1;
uint16 val2;
uint8 val3;
uint8 val4;
uint16 val5;
uint8 val6;
} foo;
,其中uint8
和uint16
分别定义为unsigned char
和unsigned short int
。我试图使用fscanf
从tab分隔的文本文件扫描。代码是这样的:
foo f;
FILE* fptr = fopen("test.txt", "r");
if (fptr == NULL)
{
printf("Error opening file");
return;
}
if (6 == fscanf(fptr, "val2=%hut"
"val1=%ut"
"val3=%ut"
"val4=%ut"
"val5=%hut"
"val6=%u", &f.val2, &f.val1, &f.val3, &f.val4, &f.val5, &f.val6))
{
//Some other code
}
else
{
printf("Error");
}
fclose(fptr);
在调试时,我发现无论我使用什么格式说明符或在文本文件中输入什么,存储在val2
中的值都是0
。我设法通过在foo
的定义中切换val1
和val2
来修复这个bug。我不明白的是为什么会出现这种情况。
我猜这和对齐有关,但如果有人能给我一个很好的解释,我真的很感激在第一种情况下到底发生了什么。
使用32位类型的格式说明符将指向8位变量(val1)的指针传递给scanf,将导致fscanf的写入超过该变量的末尾,从而越过结构体(val2和val3)的相邻成员(s)的顶部。
%u是unsigned int,所以scanf()认为它有一个4字节的地址来存储它的值。相反,它可能会将数据写入另外两个变量的内存地址。
相关文章:
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 在 64 位边界上对齐C++结构数组?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- C++ 类层次结构中的"对齐"是什么意思?
- 哪些值存储在对齐的结构/类对象的填充字节中
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 在 c++ 中将数据从未对齐结构数组移动到对齐结构数组
- vcpkg:指定结构成员对齐方式
- 使用字节数组具有单字节对齐方式的结构是否安全
- 编译器会秘密增加结构的对齐方式吗?
- OPENCL结构对齐错误
- C++ 编译器正在更改我的结构的对齐方式.我怎样才能防止这种情况
- 对齐构件的对齐结构为成员(C )
- C++对齐结构
- 返回对齐结构后出现分段错误
- 内存对齐-结构的总大小是结构对齐的倍数,而不是处理大小
- 如何对齐结构数组,每个结构都需要对齐(SSE)
- 使用alignas对齐结构
- 分配对齐结构的数组