C语言小总-----malloc free
程序员文章站
2022-05-11 22:25:19
...
#include<malloc.h>//头文件
malloc 开辟的是字节数
malloc 只负责空间的开辟 不负责类型的说明
malloc出来的是无类型指针
其类型由自己的强转决定
malloc开辟的空间在堆中 程序结束后 这块空间不会被释放
因此 ip指向的malloc开辟空间的首地址 可以被return
但数组放在栈区 函数结束后空间被回收 因此数组名不可以被return
int main()
{
int *ip = NULL;
char *cp = NULL;
int n = 0;
cin>>n;
if(n<=0) return 0;
ip = (int *)malloc(sizeof(int)*n);
for(int i = 0;i<n;i++)
{
ip[i] = i;
}
cp = (char *)malloc(sizeof(char)*n);
for(int i = 0;i<n-1;i++)
{
cp[i] = i + 'a';
}
cp[n-1] = '\0';
free(ip);
free(cp);
}
错误示范
int n = 10;
int *p = NULL;
p = (int *)malloc(sizeof(int)*n);
for(int i = 0;i<n;i++)
{
*p = i;
p = p+1;
}
free(p);
正确示范
int n = 10;
int *p1 = NULL;
char *p2 = (int *)malloc(sizeof(int)*n);
p1 = p2;
for(int i = 0;i<n;i++)
{
*p2 = i;
p2 = p2+1;
}
free(p1);
malloc 申请多少空间 之后就要释放多少空间
malloc 开辟的指针要妥善保管 不可以进行移动操作 否则 虽然编译没问题但 运行时会崩溃之前的空间就丢了
ip = (int *)malloc(sizeof(int));
*ip = 100;
free(ip);
申请空间后 会有1标识 防止他们使用此空间
释放空间后 将1 换成0标识 将内存里面的值清C
被free掉内存之后 指针指向之前的位置不会发生改变 依然会找到那个地址 叫做空悬指针 [非常可怕的家伙,可以通过此空悬指针去改变存放在此空间里的内容]
因此 为了避免这种事情的发生 因此free掉之后的指针要置空
堆区 如果开辟空间之后 需要释放空间 必须给出free 否则不释放
动静态开辟二维数组的区别
动态(malloc)开辟二的维数组 | 静态开辟二的维数组 |
---|---|
存放在堆区 | 存放在栈区 |
内存不连续 | 内存连续 |
结束时需要释放 | 结束时不需要释放 |