【发布时间】:2020-01-28 08:31:12
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
struct someStruct {
int ivar;
char cvar;
float fvar;
};
main(argc,argv)
const char** argv;
{
struct someStruct someObj;
someObj.ivar = 1;
someObj.fvar = 2.3;
someObj.cvar = 'r';
printf("%u\n",&someObj.fvar);
printf("%u\n",(&someObj.cvar + 4));
printf("%f\n",*((&someObj.cvar) + 4));
printf("%f\n",someObj.fvar);
}
这是我编写的一个程序,它试图通过在 char 的地址上加 4 来访问fvar 的地址。
我知道松弛字节的概念。我试图访问那段记忆,瞧!它正确打印了地址。
printf("%u\n",&someObj.fvar);
printf("%u\n",(&someObj.cvar + 4));
两者都打印相同的地址。
然后我尝试通过以下方式访问fvar:
printf("%f\n",*((&someObj.cvar) + 4));
printf("%f\n",someObj.fvar);
和
0.000000
2.300000
是我的结果。
然后我意识到 char* 和 float* 的解释不同。
所以,我尝试了从 char* 到 float* 到 float 以及从 char 到 float* 到 float 的各种类型转换,以及在所有可能的点上,例如 typecasting the returned address to float,使用 4.0 而不是 @ 987654329@(我意识到它不应该工作......但它没有)等等。
不知何故,它只是不打印2.300000,而是继续打印0.000000
我在哪里错过了这个概念?
请注意,我有一个 64-bit MinGW 并添加了 slack-byte(我知道有些没有),我已经验证过:
printf("%u",sizeof(someObj.ivar));
printf("%u",sizeof(someObj.fvar));
printf("%u",sizeof(someObj.cvar));
printf("%u",sizeof(someObj));
分别产生4、4、1 和12 ....(sizeof(char) + 3)。
附:我知道这是一个可怕的想法,但这是我通常学习概念的方式 XD
【问题讨论】:
-
printf("%u\n",&someObj.fvar);已经有未定义的行为。%u接受unsigned int,而不是指针。 -
main(argc,argv) const char** argv;是过时的标准 C 语法。它于 1999 年正式从语言中删除。您从什么来源学习 C? -
K&R C(第 1 版)于 1978 年出版,距今已有 41 年。我希望你意识到从那时起语言已经发生了很大的变化。
-
很高兴看到此类问题的参考资料 - cpprefernce sizeof。
sizeof"返回 size_t 类型的值"。 -
sizeof产生一个size_t,它不一定与unsigned int相同(在当今的 64 位平台上通常不是)。
标签: c pointers struct padding sizeof