malloc与calloc堆区的使用与结构体内存如何计算

malloc与calloc(这俩都是C环境下)(堆区)  #include<cstdlib>  rand srand
(1)malloc是允许n变量的其作用是在c环境下申请 堆区空间  在这里要注意malloc()返回的是一个地址需要使用指针变量来承接如(int*)。
注意:地址是什么类型的变量就需要使用什么什么类型的变量的指针如通过语句    
int* p=( int* )malloc(sizeof(int)*n);
 解释说明:
sizeof()求取空间大小 ,malloc内部是 没有变量的需要创建一个变量来接受malloc的值如 p(malloc返回值是void*)因此需要强制转换变量(int*)这里前面的类型(int)是由申请空间的类型 sizeof(int)来决定的,p接受的值可以当成 动态数组来使用的,n为申请的空间数量。
                                                 int* p=( int* )malloc(sizeof(int)*n);
申请的空间在没有赋值的时候里面内部的元素都是 随机数是没有进行初始化的。
当空间刚刚建立的时候,是只有空间没有值的,并且申请空间后在结束的时候是需要 释放的 free()注意申请的地址是多少结束释放的地址就必须是多少如果地址产生偏移就无法释放如
int* p=(int*)malloc(sizeof(int)*n) ;                 p++;              free(p);
如果没有写free()可能会出现 内存泄漏;
例1:
using namespace std;
struct Arr
{
int val;
int index;
};
//int a[100000]    全局区定义   int a[n]这里是错误的 静态数组 不允许使用 变量 只能使用 常量
int main()
{
int n;      //这里本质上是 创造了一个空间 用来储存数据
cin>>n;
//int a[10000]      栈区  空间范围有限
//sizeof()  注意它是一个运算符不是函数作用:计算()里面的字节大小
int* p=(int*)malloc(sizeof(int)*n);
//这里的n是多少块   结束空间分配的时候会返回一个地址         (int*)  强制类型转换
//int* 指针变量用来保存地址 
//类似一个动态数组 cout<<p[0];输出第一个元素
return 0;
};
(2)calloc:
   int* p=(int* )calloc(n,sizeof(int))
  在没有赋值的情况下里面的 值为0   n为申请的空间块数  sizeof(类型)为申请的一块类型空间的大小。  注意这里也要使用free()来释放空间。
二、求取结构体的空间大小
 1. (1)结构体在分配空间的时候要按照顺序实现;
     (2).字节对齐  找成员当中最大的类型来作为对齐数  因此结果一定是他的整数倍;
     (3). 按照整数倍地址对齐
 2.位域  1字节=8比特   二进制下的一位是占1比特·的·
(1)看相邻成员是否是同种类型 是的话  可以尝试往一个类型单位当中进行放置;
  char a:1;//这里的:1是指占1比特    如果是:2就是占2bit
  char a:1      char
  int b:1;        int
  char :1;       char          3*4=12字节
  char :1;
(2)一个单位放不下就用两个单位,不能跨单位进行放置
  char a:1      char
  int b:1;        int
  char :7;       char          4*4=16字节
  char :7;        char 
(3)指针所占空间大小 只取决于当前编译的环境
x86    32bit    4字节   (一般情况下默认)
x64    64bit    8字节
unsigned  默认为 int 占4字节
(4)不仅仅只求出所占空间数大小要注意对齐的  类型用它的 类型来作为对齐数占多少空间
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值