sizeof结构体数组指针和sizeof数组指针的区别
请思考一下
以下代码输出的 sizeof 分别是多少?
#include <stdio.h>
typedef struct {
char name[100];
unsigned char age;
} student_t, *student_ptr;
int main(int argc, char *argv[])
{
student_t stu = {0};
student_ptr pStu = &stu;
char name[100] = {0};
char *pName = name;
printf("sizeof(stu.name): %ld\n", sizeof(stu.name));
printf("sizeof(pStu->name): %ld\n", sizeof(pStu->name));
printf("sizeof(pStu): %ld\n", sizeof(pStu));
printf("sizeof(name): %ld\n", sizeof(name));
printf("sizeof(pName): %ld\n", sizeof(pName));
return 0;
}
结果如下:
sizeof(stu.name): 100
sizeof(pStu->name): 100
sizeof(pStu): 8
sizeof(name): 100
sizeof(pName): 8
问题
为什么同样是指针 sizeof(pStu->name)=100,而 sizeof(pName)=8 呢?
sizeof(pStu->name),首先 pStru 是指向结构体 stu 的指针,如果要计算 sizeof(pStru) 的值,在 64 位机器上,结果应该为 8,而代码中计算的是 sizeof(pStu->name),即计算的是成员 name 的 size,因此,sizeof(pStu->name) 的值为 100;而 pName 是指向 name 的指针,因此在 64 位机器上,sizeof(pName)=8。
总结:sizeof(pStu->name) 求的是成员 name 的 size,而 sizeof(pName) 求的是数组指针的 size,两者完全不同,不可以混淆。
sizeof结构体数组指针和sizeof数组指针的区别的更多相关文章
- sizeof(结构体)的计算
摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如 ...
- C#中结构体定义并转换字节数组
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...
- C语言 结构体中的零长度数组
/* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...
- c 结构体中的变长数组
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; ...
- c语言结构体中的一个char数组怎么赋值?
目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...
- sizeof结构体
规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...
- C++ 结构体案例2 升序打印数组中的元素
1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...
- sizeof(结构体)和内存对齐以及位域
Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...
- 结构体struct和typedef后面接指针的含义
typedef struct file { ... }FileInfo, *FileP; 上述程序中定义了一个结构体,结构体的名字为file,并且给其指针 取个别名为FileP,所以后续程序中出现Fi ...
- C 语言结构体之点运算符( . )和箭头运算符( -> )的区别
很多时候,在对结构体进行相应的编码时,时而发现是用点运算符( . ),时而是用箭头运算符( -> ):那么这两者之间的使用有什么区别么? 相同点:两者都是二元操作符,而且右边的操作数都是成员的名 ...
随机推荐
- Redis从入门到放弃(2):数据类型
在Redis中,数据以键值对的形式存储.Redis支持五种主要的数据类型,每种类型都有不同的用途和特性. 本文将介绍Redis的五种数据类型:字符串(string),哈希(hash),列表(list) ...
- 2021-7-30 MySql函数的使用归类整理
Mysql字符的使用 SELECT ASCII(user_password) as 阿斯克码 FROM users;#返回首字符的ascii码 SELECT CHAR_LENGTH(user_pass ...
- 从序号和确认号理解TCP三次握手
头部信息 TCP首部存储的数据和建立连接有关,具体每个字段的用途可以参考这一篇文章,其中序号和确认号决定了发送数据的内容. 头部中间部分"保留"和"窗口"中间是 ...
- 其实webpack编译"模块化"的源码没那么难
我们在 webpack初体验 这篇文章中演示到,浏览器不支持 CommonJS ,在特定场景下才支持 Es Module ,而 webpack 可以将这些模块化的代码解析成浏览器可识别的语法. 那么 ...
- docker service 与 docker stack
转载请注明出处: 1. Docker Service Docker Service(服务)是用于定义和管理单个容器服务的概念.它是在Docker Swarm集群中运行的容器实例,可以使用docker ...
- 《Kali渗透基础》14. 无线渗透(四)
@ 目录 1:相关工具 1.1:Aircrack-ng 1.1.1:airmon-ng 1.1.2:airodump-ng 1.1.3:aireplay-ng 1.1.4:airolib-ng 1.1 ...
- 使用 Laf 一周内上线美术狮 AI 绘画小程序
"美术狮 AI 绘画"(以下简称"美术狮"),是我们小团队的一次尝试,定位是人人都可以上手的,充满创意的,理解中文和中国文化的图片生成工具. 在完善图像模型和论 ...
- 算术逻辑单元的实现(ALU)
一.实验目的 掌握Vivado集成开发环境 掌握Verilog语言基本知识. 掌握并理解算术逻辑单元ALU的原理和设计 二.实验预习 1.ALU(算术逻辑单元)的16种运算的编码 三.模块接口设计 A ...
- Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!
关注TechLeadCloud,分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师, ...
- PivotGridControl自定义行数据的统计公式
我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明 数据源: 注意:此时数据列指定的SummaryT ...