C-结构变量是指针吗?

时间:2018-06-21 15:28:34

标签: c struct

我进行了很多搜索,但找不到任何与此相关的主题。我的问题是: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

3 个答案:

答案 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。它将返回任何变量的地址,无论是否分配了堆。