堆内存的分配和释放

malloc

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

free

示例
int i = 10;
int *p = (int *)malloc(sizeof(int)) // 在堆中分配一个整数大小的内存.
printf("%p, %d\n", &i, i);
printf("%p, %d\n", p, *p);
free(p); // 必须要手动释放堆内存.


特殊示例:

int main()
{
    char *s = null;
    test(s);
    print("%s\n", s);
}

void test(char *p)
{
    p = malloc(sizeof(char) * 10);
    strcpy(p, "hello");
}

打印结果:null

原因:
s指针指向的是空地址->空地址赋值给p->p指向了一个新的堆地址->p进行字符串赋值->
s还是指向的空地址->打印字符串s结果为null



int main()
{
    char *s = malloc(sizeof(char) * 10);
    test(s);
    print("%s\n", s);
}

void test(char *p)
{
    strcpy(p, "hello");
}

打印结果:hello



int main()
{
    char *s = null;
    test(&s);
    print("%s\n", s);
}

void test(char **p)
{
    *p = malloc(sizeof(char) * 10);
    strcpy(*p, "hello");
}

打印结果:hello
解析:
s指向了空地址->s将自己的地址传递给p->*p申请堆空间(s的值也就指向了堆空间)->
*p赋值(相当于s进行字符串赋值)->输出字符串

calloc

calloc(size, sizeof(int))
calloc(4, sizeof(int)) // calloc会将自动分配的内存清0
相当于:
malloc(4 * sizeof(int)) // 分配的内存不会清0
memset(p, 0, 4 * sizeof(p) // 手动清0

int i[10] = {0};
memset(i, 0, sizeof(i)) // 分配的数组内存清0

实现动态分配内存:
#include <stdio.h>
#include <string.h>
#include<stdlib.h>


void init_array(char *s);
void add_array(char *s);

char *array = NULL;

int main(int argc, char *argv[])
{
    init_array("hello");
    add_array(argv[1]);
    printf("%s\n", array);
    free(array);
    return 0;
}

void init_array(char *s)
{
    // 初始化之前必须要释放.
    free(array);
    if (s != NULL) {
        array = malloc(strlen(s) * sizeof(char) + 1);
        strcpy(array, s);
    }
}

void add_array(char *s)
{
    if (array == NULL) {
        init_array(s);
    } else {
        int lenArr = strlen(array);
        int lenS = strlen(s);
        char *temp = malloc((lenArr + lenS) * sizeof(char) + 1);
        temp[lenArr + lenS] = 0;
        for (int i = 0; i < lenArr; i++) {
            temp[i] = array[i];
        }
        for (int i = 0; i < lenS; i++) {
            temp[lenArr + i] = s[i];
        }
        free(array);
        array = temp;
    }
}

realloc()
重新分配内存地址
array = realloc(array, a+b+1)

void add_arrary_new(char *s)
{
    if (s == NULL)
        return ;
    if (array) {
        int a = strlen(array);
        int b = strlen(s);
        // 重新分配内大小.
        array = realloc(array, a + b + 1);
        memset(array + a, 0, b + 1)
        strcpy(&array[a], s);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值