我进行了很多搜索,但找不到任何与此相关的主题。我的问题是:struct变量是指针吗?而且如果每个输入都存储在struct成员的地址中,那么struct变量是做什么用的?
这是我用于检查struct变量的代码,当我打印存储在变量中的内容时,它给了我另一个地址,但我不知道该地址的用途。
这是我的代码及其输出:
struct test
{
int a;
int b;
char c;
};
int main()
{
struct test f;
printf("%u", &f);
printf("\n%d", f);
printf("\n%u", &f.a);
printf("\n%u", &f.b);
}
输出:
6487616
6487600
6487616
6487620
答案 0 :(得分:4)
简短答案:否。
长版:由于提供的参数与转换说明符不匹配,因此上述程序中的所有打印语句均会调用未定义的行为。
要详细说明,要打印指针,您需要使用%p
转换说明符,并将参数强制转换为void *
。
没有用于结构变量的泛型(一对一排序)格式说明符。您需要选择具有相应格式说明符的单个成员(或其成员),并将其作为参数传递。
也就是说,关于第一个成员和访问权限,
[...]指向a的指针 经过适当转换的结构对象指向其初始成员(或者该成员是 位域,然后到它所在的单元),反之亦然。 [...]
答案 1 :(得分:2)
结构变量是指针吗?
不。给定结构定义:
struct test
{
int a;
int b;
char c;
};
和声明:
struct test f;
您在内存中得到以下内容(假设4个字节int
s):
+---+ ---+
f: | | |
+---+ |
| | |
+---+ +--- f.a
| | |
+---+ |
| | |
+---+ ---+
| | |
+---+ |
| | |
+---+ +--- f.b
| | |
+---+ |
| | |
+---+ ---+
| | f.c
+---+
成员以声明的顺序排列-f.a
占据对象的前四个字节,f.b
占据后四个字节,f.c
占据最后一个字节。可能会出现其他“填充”字节,以满足对齐要求(在这种情况下,编译器可能会在f.c
之后添加3个填充字节,以便下一个对象以4的倍数开头的地址开始)。
如您所见,结构的第一个成员(f.a
)的地址将与整个结构对象的地址相同。在第一个成员之前没有任何填充或元数据。
要查看各种地址和大小,请使用以下内容:
printf( "address of f: %p\n", (void *) &f );
printf( "size of f: %zu\n", sizeof f );
printf( "address of f.a: %p\n", (void *) &f.a );
printf( "size of f.a: %zu\n", sizeof f.a );
printf( "address of f.b: %p\n", (void *) &f.b );
printf( "size of f.b: %zu\n", sizeof f.b );
printf( "address of f.c: %p\n", (void *) &f.c );
printf( "size of f.c: %zu\n", sizeof f.c );
就像我上面所说的,编译器很可能会在f.c
之后添加填充字节,因此sizeof f
可能会比sizeof f.a + sizeof f.b + sizeof f.c
大。
答案 2 :(得分:0)
正在使用的&
运算符是address-of operator。它将返回任何变量的地址,无论是否分配了堆。