请思考一下

以下代码输出的 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数组指针的区别的更多相关文章

  1. sizeof(结构体)的计算

    摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如 ...

  2. C#中结构体定义并转换字节数组

    最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...

  3. C语言 结构体中的零长度数组

    /* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...

  4. c 结构体中的变长数组

    在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; ...

  5. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

  6. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...

  7. C++ 结构体案例2 升序打印数组中的元素

    1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...

  8. sizeof(结构体)和内存对齐以及位域

    Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...

  9. 结构体struct和typedef后面接指针的含义

    typedef struct file { ... }FileInfo, *FileP; 上述程序中定义了一个结构体,结构体的名字为file,并且给其指针 取个别名为FileP,所以后续程序中出现Fi ...

  10. C 语言结构体之点运算符( . )和箭头运算符( -> )的区别

    很多时候,在对结构体进行相应的编码时,时而发现是用点运算符( . ),时而是用箭头运算符( -> ):那么这两者之间的使用有什么区别么? 相同点:两者都是二元操作符,而且右边的操作数都是成员的名 ...

随机推荐

  1. expect: telnet2switch

    #!/usr/bin/expect if {$argc != 1} { puts "usage: ./telnet2sswitch <r2|r3>" exit } if ...

  2. 【go语言】2.4.2 自定义包的创建和使用

    在 Go 中,任何一个目录都可以被视为一个包.创建自定义包的基本步骤是: 新建一个目录,用于存放包的源文件. 在新建的目录中编写 Go 代码,代码的第一行应该是 package 包名. 使用 impo ...

  3. DHorse v1.3.0 发布,基于k8s的发布平台

    综述 DHorse是一个简单易用.以应用为中心的云原生DevOps系统,具有持续集成.持续部署.微服务治理等功能,无需安装依赖Docker.Maven.Node等环境即可发布Java.Vue.Reac ...

  4. 零基础入门——从零开始学习PHP反序列化笔记(一)

    靶场环境搭建 方法一:PHPstudy搭建 GitHub地址 https://github.com/mcc0624/php_ser_Class 方法二:Docker部署 pull镜像文件 docker ...

  5. 【Python】@property用法简述

    参考自:Python的@property是干嘛的?作者:Python测试开发 如果我们设置类的属性私有化,那么可以使用@property 使属性可以被外部访问并修改. 在使用 @property 之前 ...

  6. Flutter 学习笔记(01)__从 0 开始创建一个 flutter 项目

    最近发现有不少的公司已经跳出 uniapp 的坑坑,开始使用 flutter 开发app了,为了让自己不失业,赶紧卷起来!此篇文章教你从 0 基础开发一个 简单页面,文章篇幅较长,建议收藏!也可以直接 ...

  7. nflsoj 选数1 2 3

    5711 取数-1 状态表示:1维 集合:前 \(i\) 个数里面所有的选法和 属性:所有的选法和的最大值 状态计算:选或不选 选:\(f(i-1)+a_i\) 不选:\(f(i-1)\) #incl ...

  8. dBeaver操作iotdb并实现导入和导出

    1.windows下操作iotdb,现在官网下载相关的iotdb包 官网地址:https://archive.apache.org/dist/iotdb/   一般建议下载 -all的  2.打开db ...

  9. 详谈 springboot整合shiro

    背景: 上文学习了shrio 基本概念后,本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解. 利用Shiro进行登录认证主要步骤: 1. 添加依赖: ...

  10. (2023.7.24)软件加密与解密-2-1-程序分析方法[XDbg].md

    body { font-size: 15px; color: rgba(51, 51, 51, 1); background: rgba(255, 255, 255, 1); font-family: ...