C语言结构体内存分配详情
#include <stdio.h> int main()
{
/***************************************************
*
* 结构体内存分析(注意结构体里面定义成员结束后要使用分号):
* struct Date
* {
* int year;
* int month;
* int day;
* };
* struct Student
* {
* int age;
* char sex;
* };
* struct Stu
* {
* int age;
* char a;
* char b;
* char c;
* char d;
* };
* 理论上:结构体所占用的存储空间是各个成员变量所占的存储空间之和。
* 但是由于性能等原因分配内存是按照补齐算法进行分配。
* 补齐算法(对齐算法):结构体所占用的存储空间,必须是所有成员中占用存储空间最大的成员的倍数
* 结构体成员内存分配:分配内存是按照高位寻址,但是结构体分配内存时,把低位内存分配给最先定义的变量
* 注意:
* 1.定义结构体类型(并不会分配存储空间)
* 2.定义结构体变量(真正分配存储空间)
*
****************************************************/
struct Date
{
int year;
int month;
int day;
};
printf("Date类型占用的存储空间是:%d\n", sizeof(struct Date));
struct Student
{
int age;
char sex;
};
printf("Student类型占用的存储空间是:%d\n", sizeof(struct Student));
struct Stu
{
int age;
char a;
char b;
char d;
};
printf("Stu类型占用的存储空间是:%d\n", sizeof(struct Stu));
struct St
{
int age;
char a;
char b;
char d;
};
printf("St类型占用的存储空间是:%d\n", sizeof(struct St));
struct Date date = {, , };
printf("date变量的地址是:%p\n", &date);
printf("year变量的地址是:%p\n", &date.year);
printf("month变量的地址是:%p\n", &date.month);
printf("day变量的地址是:%p\n", &date.day);
return ;
}
Date类型占用的存储空间是:
Student类型占用的存储空间是:
Stu类型占用的存储空间是:
St类型占用的存储空间是:
date变量的地址是:0022fee4
year变量的地址是:0022fee4
month变量的地址是:0022fee8
day变量的地址是:0022feec
C语言结构体内存分配详情的更多相关文章
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...
- C语言-结构体内存对齐
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- go语言结构体内存对齐
cpu要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线,交给cpu,如果地址总线只有8根,那这个地址就只有8位可以表示[0,255]256个地址,因为表示不了更多 ...
- C语言中结构体内存存储方式
C语言中结构体内存存储方式 结构体的默认存储方式采用以最大字节元素字节数对其方式进行对齐,例如一个结构体中定义有char.int类型元素,则结构体存储空间按照int类型占用字节,如果还有double类 ...
- C语言之结构体内存的对齐
C语言之结构体内存的对齐 大纲: 零.引例 一.结构体内存对齐规则 二.怎样计算结构体的大小 三.设计结构体时要注意的方面 四.为什么存在内存对齐 五.修改默认对齐数 在前面的章节中,我们谈到了C ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- 关于结构体内存对齐方式的总结(#pragma pack()和alignas())
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...
- struct结构体内存大小
一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长 ...
- C++ struct结构体内存对齐
•小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; ...
随机推荐
- 关于java使用json不能够使用报没有导包的问题,以及前后台交互json数据的使用
博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/12/02/%e5%85%b3%e4%ba%8ejava%e4%bd%bf%e7%94%a8 ...
- Scrapy框架: middlewares.py设置
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...
- spark性能调优02-JVM调优
1.降低cache操作的内存占比 1.1 为什么要降低cache操作的内存占比 spark的堆内存分别两部分,一部分用来给Rdd的缓存进行使用,另一部分供spark算子函数运行使用,存放函数中的对象 ...
- sublime推荐插件
SyncedSidebarBg:侧边栏底色统一 Emmet:集合多种功能,大名鼎鼎的 Zen coding ==> 不过对于嵌入式的我没多大用啊 Sublime CodeIntel:代码提示 A ...
- input输入框数字转带千分位的字符串
数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...
- alter update
## sql alter update 添加.修改.删除字段 ## 添加列名alter table 表名 add 列名 列类型;alter table 表名 add 列名 列类型 not null d ...
- 【CSS3】rgba与opacity
RGBA 语法 R:红色值.正整数 | 百分数 G:绿色值.正整数 | 百分数 B:蓝色值.正整数| 百分数 A:透明度.取值0~1之间 为什么要用RGBA而不用opacity 因为在项目中需要用到一 ...
- leetcood学习笔记-14*-最长公共前缀
笔记: python if not 判断是否为None的情况 if not x if x is None if not x is None if x is not None`是最好的写法,清晰,不 ...
- git——创建分支后,切换分支报错(error: pathspec 'master' did not match any file(s) known to git)
error: pathspec 'master' did not match any file(s) known to git 解决办法: 1.查看分支 git branch -a 2.获取所有分支 ...
- js-原生js触发器使用
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...