我在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;
}
答案 0 :(得分:0)
ptr
的值必须与var.title
的第一个字节的地址相同。从这个测试来看,它似乎完全符合预期(前两行0xffdb19d4
):
答案 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应该像数组一样,但它似乎不是这样,因为指针不指向第一个组件的地址。
由于book
和var
是两个不同的变量,因此它们将具有不同的地址。您的代码已初始化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