天天看点

C语言--动态内存管理

1 malloc--申请动态内存空间

—void *malloc(size_t size)

malloc函数向系统申请匹配size个字节的内存空间。并返回一个指向这块空间的指针

如果函数调用成功,返回一个指针申请的内存空间的指针,由于返回类型是void指针(void *),

所以他可以被转换成任何类型的数据;如果函数调用失败,返回值是NULL。另外,

如果size的参数设置为0,返回值也可能是NULL,但是这不是调用失败。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ptr;
    
    ptr = (int *)malloc(sizeof(int));
    if(ptr == NULL)
    {
        printf("分配内存失败\n");
        exit(1);
    }
    printf("请输入一个整数:");
    scanf("%d",ptr);
    
    printf("你输入的整数是:%d\n",*ptr);
    return 0;

}
           

2 free--释放动动态内存空间

—void free(void *ptr);

free函数释放ptr参数指向的内存空间。该内存空间必须是由malloc、callloc或realloc函数

申请的。否则,该函数将导致未定义行为。如果ptr参数是NULL,则不执行任何操作。

注意:该函数并不会修改ptr参数的值,所以调用后,它仍然指向原来的地方。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ptr;
    
    ptr = (int *)malloc(sizeof(int));
    if(ptr == NULL)
    {
        printf("分配内存失败\n");
        exit(1);
    }
    printf("请输入一个整数:");
    scanf("%d",ptr);
    
    printf("你输入的整数是:%d\n",*ptr);
    free(ptr);
    return 0;

}
           

3 calloc--申请并初始化一系列内存空间

void *calloc(size_t nmenb, size_t size);

calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间

(即申请的总空间尺寸为nmeb *size),这些内存空间全部被初始化为0。

calloc函数在申请完之后,自动初始化该内存空间为0;

malloc函数不进行初始化操作,里面的数据是随机的。

4 realloc--重新分配内存空间

void *realloc(void *ptr, size_t  size);

readlloc函数修改ptr指向的内存空间大小为size字节

如果重新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;

如果新的内存空间比原来的小,可能会丢失数据。

memset:使用一个常量字节填充内存空间

memcpy:拷贝内存空间

memmove:拷贝内存空间

mencmp:比较内存空间

memchr:在内存空间中搜索一个字符