c语言的内存分配
malloc
int x;
cin>>x;
int *ptr=(int*) malloc(x* sizeof(int));
p[0]=5; p[1]=1;
malloc返回的是void类型的指针,所以要强制转换
如果分配失败,malloc会返回0
知识扩展*:c 采用nullptr来代替0,但是nullptr在c语言中不能用
calloc
int *ptr=(int* )calloc(x, sizeof(int) )
calloc分配的内存时自动将分配的内存里的值都清0,而mallloc不会
分配失败,返回0
realloc
重新分配内存
int *ptr1=(int* )realloc(ptr,500);
ptr是之前的内存地址,500是重新分配后的内存大小
重新分配有两种情况
假设将100内存重新分配到1000
1.在原有内存基础上扩充,此时返回的内存地址不变,原有数据保留
100 | 900 |
2.如果在原来的基础上不能扩充了,比如剩下的内存只有800,还有100被别的程序占用了,但是要扩充900,所有就要另起一行
100 数据a | 800 |
100 数据a | 900 |
将原来的100(数据a)复制到另外的内存区域,此时返回的内存地址改变,原有数据保留
如果内存分配失败,返回0
释放内存free
语法:
free(ptr);
特别注意*:释放后的内存不能再使用,此时ptr的值并没有变化,但是它成了悬挂指针,释放后的内存如果使用的话,可能会报错,也可能不报错。释放后的内存不能再次释放
new
底层还是用的c语言内存分配
int *ptr=new int;
int *ptr1=new int[5]
分配5个int大小的内存
释放内存
delete ptr;
delete[] ptr;
特别注意*:c释放内存用free,c 用delete,不能混用