堆内存的分配和释放

来源:互联网 发布:node buffer 编辑:程序博客网 时间:2024/06/03 23:47

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结果为nullint main(){    char *s = malloc(sizeof(char) * 10);    test(s);    print("%s\n", s);}void test(char *p){    strcpy(p, "hello");}打印结果:helloint 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);    }}
原创粉丝点击