C语言,结构体成员的地址
先回顾一个基础的知识,不同类型的数据在16位,32位,64位的机器分别占用多少字节。
| 类型 | 16位机器(字节) | 32位机器(字节) | 64位机器(字节) |
|---|---|---|---|
| char | 1 | 1 | 1 |
| short | 2 | 2 | 2 |
| int | 2 | 4 | 4 |
| unsigned int | 2 | 4 | 4 |
| float | 4 | 4 | 4 |
| double | 8 | 8 | 8 |
| long | 4 | 4 | 4(win) / 8(linux) |
| long long | 8 | 8 | 8 |
| unsigned long | 4 | 4 | 8 |
| 指针 | 2 | 4 | 8 |
可以看到long类型的数据比较特殊,在写跨平台的应用时需要注意,最好是避免使用
定义两个结构体
typedef struct _demo_node_{
struct _demo_node_* pprenode;
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0];
}demo_node;
typedef struct {
char province[8];
char city[8];
}address_info;
写程序来验证一下,结构体本身的地址,以及它包含的成员的地址,有什么样的联系
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct _demo_node_{
struct _demo_node_* pprenode;
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0];
}demo_node;
typedef struct {
char province[8];
char city[8];
}address_info;
int main(void)
{
demo_node* person = NULL;
person = (demo_node*)malloc(sizeof(demo_node)+sizeof(address_info));
if(NULL == person)
{
printf("malloc demo_node failed\n\r");
return -1;
}
printf("person结构体的地址 = 0x%0x\n",person);
printf("person->pprenode的地址 = 0x%0x\n",&(person->pprenode));
printf("person->pnextnode的地址 = 0x%0x\n", &(person->pnextnode));
printf("person->member_num的地址 = 0x%0x\n", &(person->member_num));
printf("person->age的地址 = 0x%0x\n", &(person->age));
printf("person->addr的地址 = 0x%0x\n", &(person->addr));
free(person);
return 0;
}
采用windows的64位编译器编译,程序输出的结果为
person结构体的地址 = 0x1f1420
person->pprenode的地址 = 0x1f1420
person->pnextnode的地址 = 0x1f1428
person->member_num的地址 = 0x1f1430
person->age的地址 = 0x1f1434
person->addr的地址 = 0x1f1436
我们来分析一下为什么是这样的结果:
结构体指针person的地址,与它指向的结构体的第一个成员(person->pprenode)地址是一样的,都是0x1f1420
pprenode和pnextnode都是指针变量,由于指针变量在64位机器中占8个字节,所以
person->pnextnode的地址 = 8 + person->pprenode的地址 = 0x1f1428person->member_num的地址 = 8 + person->pnextnode的地址 = 0x1f1430
member_num是unsigned long类型的变量,在windows的64位机器中占4个字节,所以person->age的地址 = 4 + person->member_num的地址 = 0x1f1434
age是unsigned short类型的变量,可以等同于short占用的字节,都是2,所以person->addr的地址 = 2 + person->age的地址 = 0x1f1436
关于结构体成员地址,就简单介绍到这里了!
细心的同学一定发现了demo_node 结构体中char addr[0] 这个成员,这其实是个占位符,至于它的用法,可以看我的另一篇文章《C语言,变长数组的用法》,还是在这个示例代码的基础上进行介绍,方便快速理解。
C语言,结构体成员的地址的更多相关文章
- 3.c语言结构体成员内存对齐详解
一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 #include <stdlib.h> #include <stdio.h> stru ...
- 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...
- C语言结构体的字节对齐原则
为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- 怎样求结构体成员的偏移地址 || 结构体的 sizeof 总结
C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 & ...
- 【C语言】这种求结构体成员大小的方法,你可能需要了解一下~
在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小.求某结构体中某成员的大小,你会怎么做? 例子: type ...
- C语言结构体里的成员数组和指针
struct test{ int i; char *p; }; struct test *str; ; char *b = "ioiodddddddddddd"; str = (s ...
- C语言结构体变量内存分配与地址对齐
地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
随机推荐
- JMS微服务开发示例(九)相同的微服务,按用户所在城市来分配微服务器
虽然,默认情况下,多个相同的微服务,网关是自动根据微服务的压力情况,把用户请求分配到压力较轻的微服务器上. 但是,在某些业务情景下,我们可能希望人为去控制微服务的请求分配. 举个例子,我在北京.上海. ...
- Python Code_01
author : 写bug的盼盼 development time : 2021/8/27 19:41 输出数字 print(520) 输出字符串 print('HelloWorld') print( ...
- Advanced .Net Debugging 1:你必须知道的调试工具
一.简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用.他们采取的分析方法通常包括:输出更多的调试信息,或者做一些临时性的代码审查.这里的临时性是指,通过 ...
- [转帖]Redis重大版本整理(Redis2.6-Redis7.0)
Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7.2.9.3.1),若是是偶数,则为稳定版本(例如2.6.2.8.3.0.3.2). ...
- [转帖]数据可视化之redash(支持43种数据源) (转自https://anjia0532.github.io/2019/07/08/redash/)
https://www.cnblogs.com/a00ium/p/13177272.html 人类都是视觉动物,讲究一图胜千言.如果没了可视化,那么你在跟领导汇报工作时,很大程度会鸡同鸭讲.其实 ex ...
- [转帖]SpecCPU2017 测试cpu性能
https://www.bbsmax.com/A/GBJrxP1Ed0/ SpecCPU介绍见: https://blog.csdn.net/qq_36287943/article/details/1 ...
- [转帖] Linux文本命令技巧(下)
https://www.cnblogs.com/codelogs/p/16060108.html 简介# 前一篇介绍了Linux中一些基本的文本命令与使用技巧,但是结合场景过少,本篇结合工作中一些常见 ...
- [转帖]计算机体系结构-cache高速缓存
https://zhuanlan.zhihu.com/p/482651908 本文主要介绍了cache的基本常识.基本组成方式.写入方法和替换策略,在基本组成方式和替换策略两节给出了较为详细的硬件实现 ...
- 一次典型的Memroy Leak的跟踪学习过程
背景 周四时某项目在QQ群里说自己的系统出现了CPU占用较高的情况. TOP 查看发现大部分占用CPU的都是 JAVA核心进城后附近的进程. 所以初步怀疑 是出现了FullGC的问题. 然后群里反馈了 ...
- 神通奥斯卡数据库是否兼容Oracle, 以及参数修改的办法
1. 最近公司要适配神通数据库, 但是因为一些功能异常.参数可能存在风险. 为了减少问题, 想着简单描述一下这些的处理. 开发和客户给的默认参数建议 1. 不选择 兼容oracle模式 2. 字符集选 ...