malloc
使用格式:
(void*) malloc (size_t Size);
内存开辟成功后返回对应类型的指针,若内存分配失败,则返回NULL;
Size:指定分配内存的大小,以字节为单位。
使用场景:
malloc的使用通常仅仅是为了分配内存空间,而不对空间做任何额外处理。
例:分配一块类型为int大小为100的数组arr。
#include<stdio.h>
#include<stdlib.h>
int main(){
int* arr = (int*)malloc(sizeof(int) * 100);
if(arr!=NULL){
printf("内存开辟成功!");
}else{
printf("内存开辟失败");
}
free(arr);
return 0;
}
由于仅仅开辟内存而不做其余操作,这时如果遍历数组的话......
for (int i = 0; i < 100; ++i) {
printf("%d", arr[i]);
}
除了本身我们得到的内存开辟成功外,只能是未初始化的随机值了,所以在使用malloc开辟空间后应遍历数组对其进行初始化。
calloc
使用格式:
(void*) calloc(size_t num,size_t Size);
内存开辟成功后返回对应类型的指针,若内存开辟失败,则返回NULL;
num:分配内存的个数
Size:每个待分配元素的大小,以字节为单位
使用场景:
calloc与malloc的不同之处在于calloc会在分配内存的基础上会将内存中的所有元素初始化为0。
将上一个例子再做一遍:
#include<stdio.h>
#include<stdlib.h>
int main() {
int* arr = (int*)calloc(100, sizeof(int));
if (arr) {
printf("分配成功");
}
else {
printf("分配失败");
}
for (int i = 0; i < 100; ++i) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
同样的内存分配calloc即使在未赋值的情况下也是0
realloc
使用格式:
(void*)realloc(void* ptr,size_t size);
pit:指向待分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。(如果为空则分配新的内存)
size:分配内存块大小,字节为单位。若size=0,则释放内存,返回NULL。
使用场景:
对于之前已经使用过malloc,calloc,realloc分配过内存块的指针ptr,改变它的字节大小为size。
案例:使用malloc为arr分配10个int元素并赋值为0,使用realloc将元素个数改为15
#include <stdio.h>
#include <stdlib.h>
int main() {
// 使用malloc分配10个int元素的内存
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
perror("Failed to allocate memory");
return EXIT_FAILURE;
}
// 将所有元素赋值为0
for (int i = 0; i < 10; i++) {
arr[i] = 0;
}
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 使用realloc将元素个数改为15
int *temp = (int *)realloc(arr, 15 * sizeof(int));
if (temp == NULL) {
free(arr); // 如果realloc失败,释放原来的内存
perror("Failed to reallocate memory");
return EXIT_FAILURE;
}
arr = temp;
// 可以选择给新元素赋值
for (int i = 10; i < 15; i++) {
arr[i] = 0; // 或者赋其他值
}
// 打印数组的内容
for (int i = 0; i < 15; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return EXIT_SUCCESS;
}