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)不仅仅只求出所占空间数大小要注意对齐的
类型用它的
类型来作为对齐数占多少空间