gpt4 book ai didi

c++ - fscanf 和结构对齐

转载 作者:行者123 更新时间:2023-11-30 21:03:27 27 4
gpt4 key购买 nike

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

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 的定义中。我不明白的是为什么会出现这种情况。

我猜这与对齐有关,但如果有人能够很好地解释第一种情况下到底发生了什么,我真的很感激。

最佳答案

使用 32 位类型的格式说明符将指向 8 位变量 (val1) 的指针传递给 scanf 会导致 fscanf 写入超出变量的末尾,从而超出相邻成员的顶部)结构(val2 和 val3)。

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

关于c++ - fscanf 和结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com