C语言中结构体指针指向的地址是什么?附实验疑问
C结构体地址实验的困惑与解析
最近在捣鼓C语言结构体的时候,跟着教程跑示例代码,突然好奇想打印几个地址看看——结构体指针ptr的地址、结构体成员book.title和book.author的地址,结果输出的内容让我有点懵,毕竟之前看到说结构体是一组物理上连续存储的相关数据,但实际地址表现好像有点“反直觉”?
先贴一下我跑的实验代码:
#include <stdio.h> #include <string.h> struct Book { char title[50]; char author[50]; int book_id; }; int main() { struct Book book; struct Book *ptr = &book; // 填充结构体数据 strcpy(book.title, "C Programming"); strcpy(book.author, "TutorialsPoint"); book.book_id = 12345; // 打印各类地址 printf("结构体指针 ptr 自身的地址:%p\n", &ptr); printf("结构体 book 的起始地址:%p\n", &book); printf("成员 book.title 的地址:%p\n", &book.title); printf("成员 book.author 的地址:%p\n", &book.author); return 0; }
运行后我满脑子问号:
- 结构体指针
ptr的地址怎么和book的地址完全不沾边? book.title的地址居然和book的起始地址一模一样?
后来琢磨半天才搞明白,是我把两个概念搞混了:
ptr是一个指针变量,它自己也占用内存空间(通常4或8字节,取决于系统位数),&ptr打印的是这个指针变量本身在内存里的位置;而ptr里面存储的才是book的地址,要是把代码里的&ptr改成ptr,输出就会和&book完全一致。- 结构体的第一个成员起始地址必然和结构体本身的起始地址相同,因为结构体是连续存储的,第一个成员就从结构体的内存起始点开始放,这完全符合“物理上连续”的定义。
- 至于
book.author的地址,因为title是50字节的char数组,所以它的起始地址就是title的地址加50——这里因为都是char类型,没有内存对齐的填充,刚好无缝衔接,完美体现了连续存储的特性。
想通这些之后,之前的困惑瞬间就解开了,果然还是得动手跑代码、看细节才能把知识点吃透。
内容的提问来源于stack exchange,提问作者Xichu
相关产品推荐
相关产品推荐

