创建动态内存:int *p = (int *) malloc(n*sizeof(int));
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// #include<vld.h>
int main()
{
int *p = (int *)calloc(10,sizeof(int));
//这两种表达方式一样
int *pp = (int *)malloc(10*sizeof(int));
printf("calloc申请空间值:\n\n");
for(int i = 0; i < 10; i++)
{
printf("%d ", *p++);
}
printf("\n\n\n\n");
printf("malloc申请空间值:\n\n");
for(int i = 0; i < 10; i++)
{
printf("%d ", *pp++);
}
return 0;
}
malloc函数:
void *malloc(
size_t size
);
size是指其分配的字节,即要申请的空间大小,以32位系统为例:int *p = (int *) malloc(10*sizeof(int));即一次申请一个40Byte的连续空间,并将其强转位int类型,赋值给指针p,那么此时内存地址是随机的。
calloc函数:
void *calloc(
size_t num,
size_t size
);
num是指元素的数目,size是字节长度的每个元素,它的返回值指向该分配空间,比如说若果他要申请10个int或者其他类型的空间,表示如下:int *p = (int *) calloc(10, sizeof(int)),不需要人为计算。且calloc将申请的空间逐一初始化,所有元素置0
(某位大神在博客里有详细讲解:https://blog.csdn.net/yulijuanxmu/article/details/75007628)
realloc函数:
void *realloc( void *memblock, size_t size );
memblock是对以前指定的指针内存块,size是新的大小(以字节为单位),主要是对动态内存进行扩容操作。
free函数:
void free(
void *memblock
);
主要作用是释放内存块,free使用不恰当时候就会面临崩溃,他的崩溃有四个原因:
(1)越界
int main()
{
int *p1 = (int *)malloc(20);
for(int i=0;i<20;i++)
{
p1[i] = 0;
}
free(p1);
return 0;
}
(2)指针移动(找不到头)
int main()
{
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
*p = 0;
p++;
}
free(p);
return 0;
}
(3)重复释放内存
int main()
{
int *p = (int *)malloc(10*sizeof(int));
int *q = p;
free(p);
free(q);
return 0;
}
(4)释放的不是动态创建的内存
int main()
{
int a = 10;
free(&a);
return 0;
}