指向结构的指针在C中指向哪个地址?

时间:2018-02-23 19:20:28

标签: c struct

我在TutorialsPoint上以“C-Structure”的标题运行了示例代码并进行了一些实验。我试图打印结构的指针地址和结构中某些组件的地址, 这是结构:

typedef struct Books {
   char title[50];
   char author[50];
   char subject[100];
   unsigned long long  book_id;
} Book;

这是我输入的内容:

printf( "%p\n", ptr); // print the address of pointer
printf("%p\n", book.title);
printf("%p\n", book.author);

其中* ptr是指向struct的指针:

Book var = {"Stalin", "Jean-Jacques Marie", "dictatorship", 9788020612113};
Book* ptr;
ptr = &var;

然后这是ptr的输出地址:

0x7fff298eb8b0

这是book.title的地址:

0x7fff298eb980

这是book.author:

的地址
0x7fff298eb9b2

我发现这有点令人困惑,因为我在Wiki上读过struct

“定义一个物理分组的变量列表,这些变量列表放在一个内存块中的一个名称下,允许通过单个指针访问不同的变量”

所以我认为struct应该像数组一样,但它似乎不是这样,因为指针不指向第一个组件的地址。

有人可以解释一下,这个指针指向的是什么地址?

这是整个代码:

#include <stdio.h>
#include <string.h>

typedef struct Books {
   char title[50];
   char author[50];
   char subject[100];
   unsigned long long  book_id;
} Book;

int main(){

    Book book;
    Book var = {"Stalin", "Jean-Jacques Marie", "dictatorship",    9788020612113};
    Book* ptr; // pointer to struct
    ptr = &var;

    printf( "Book title : %s\n", ptr -> title);
    printf( "%p\n", ptr); // print the address of pointer
    printf("%p\n", book.title);
    printf("%p\n", book.author);


    return 0;

}

3 个答案:

答案 0 :(得分:0)

ptr的值必须与var.title的第一个字节的地址相同。从这个测试来看,它似乎完全符合预期(前两行0xffdb19d4):

http://codepad.org/ktcMv9jL

答案 1 :(得分:0)

指向struct的指针包含struct的内存地址(开头)。结构中字段的地址将是结构的内存地址+偏移量,它是所有前面字段的大小(加上对齐填充)。例如,理想情况下在此结构中

struct s
{
  char c1;
  uint16 u16;
  uint32 u32;
}

struct S s;

if the &s is 100 then
&s.c1 would be: 100 + 0 = 100
&s.u16 would be: 100 + 1 = 101
&s.u32 would be: 100 + 1 + 2 = 103

不幸的是,它不是那么理想/简单,因为大多数处理器要求16位值位于16位地址边界(2的倍数),32位值位于32位地址边界(4的倍数)等。

使用您的图书结构:

typedef struct Books
{
   char title[50];
   char author[50];
   char subject[100];
   unsigned long long  book_id;
} Book;

Book book;

if the &book is 100 then
&book.title would be: 100 + 0 = 100
&book.author would be: 100 + 50 = 150
&book.subject would be: 100 + 50 + 50 = 200
(and assuming long long is 8 bytes)
&book.book_id would be: 100 + 50 + 50 + 100 = 300 

答案 2 :(得分:0)

您写道:

  

所以我认为struct应该像数组一样,但它似乎不是这样,因为指针不指向第一个组件的地址。

由于bookvar是两个不同的变量,因此它们将具有不同的地址。您的代码已初始化ptr,地址为var。您的print语句将ptr中的地址与变量book中的成员对象的地址进行比较。

如果您更改代码以将ptr与变量var中的成员对象的地址进行比较,您会发现ptr实际上与第一个组件具有相同的地址var

ptr = &var;
printf( "%p\n", ptr);      // print the address of pointer
printf("%p\n", var.title); // address of first component of var