C语言常用内存分配malloc,calloc,realloc

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值