1.首先就是malloc和free
malloc可以申请一块连续内存
void* malloc(size_t size );
如上式,返回值是一个指针,指向开辟的那块连续空间
因为返回值是void*,所以在使用时要自己定义
开辟失败,会返回一个null指针(野指针),所以返回值一定要检查
int main() {
int* ptr = NULL;
ptr = (int*)malloc(10 * sizeof(int));//开辟了个大小为10*int类型(4)大小的内存
//判断内存是否开辟成功,若没有,给指针随便赋值.输出指针可看出内存空间是否开辟成功
if (NULL == ptr) {
*ptr = 20;
}
free(ptr);//一定要释放
system("pause");
return 0;
}
2.calloc
calloc也可以开辟连续内存,并把每个字节都初始化为0
void* calloc(size_t num,size_t size);
举个例子吧,不过我觉得初始化为0没啥用啊....
int main() {
int* ptr = calloc(10, sizeof(int));
if (NULL != ptr) {
//就使用空间了
}
free(ptr);//一定要释放
ptr = NULL;//给指针一个家
system("pause");
return 0;
}
3.realloc
realloc可以调整内存大小
void* realloc(viod* ptr,size_t size);
ptr是要调整的内存地址
size是调整后的新大小
返回值是调整后的内存起始位置(指针)
这里的返回值有可能和原来内存不一样,因为啥啊
因为扩展内存的时候是直接在原来的内存后追加新空间,原来的空间起始位置就不变,但是如果原来的内存空间不够,不能满足开辟后的大小,就会在堆空间上开辟一块大小去使用,所以返回的指针会和原来不同
int main() {
int *ptr = malloc(100);//开辟一个100的内存
if (ptr == NULL){//一定要判断
exit(EXIT_FAILURE);//退出程序
}
ptr = realloc(ptr, 1000);//调整大小,有ptr可能不再同一地方,会错误
int* p = realloc(ptr, 100);
if (p != NULL) {
ptr = p;
}
free(ptr);
return 0;
}