一、malloc函数
1、什么是malloc函数
malloc是memery(内存)和allocate(分配)的缩写,顾名思义,malloc函数为动态分配内存的意思 
 
2、malloc函数语句
int *p=(int *)malloc(sizeof(int))
 
malloc函数的形参为申请的内存空间大小,上述申请了一个int型数据的大小
malloc函数的返回值是这一块内存空间的首地址,上述代码即是将指针变量p指向这动态申请内存的
		首地址。
(*int)强制类型转换,即将该返回的地址类型强制转换为一个整型变量的地址,也就是说p和p+1相差
一个整型大小。
上述代码一个申请了12个字节的内存大小,p变量占8个字节(与cpu的大小有关),
p指向的内存为4个字节。
p本身的内存是静态分配的,p指向的内存是动态分配的
free(p)把p指向的内存释放掉,而p本身的内存只能由程序执行完毕,系统自动释放
 
3、malloc函数的用法
int *parry=(int *)malloc(sizeof(int*5);
 
动态申请5个整型变量大小的内存,即20个字节,parry指针变量指向的是该内存的首地址,
int * 表示该指针变量只能指向int型变量的地址,故parry等价于指向前4个字节,
*parry等价于parry[0];
 
#include <stdio.h>
#include <malloc.h>
int main()
{
    int *parry = (int *)malloc(sizeof(int) * 5);
    for (int i = 0; i < 5; i++)
    {
        printf("请输入%d个元素的值\n", i + 1);
        scanf("%d", &parry[i]);
    }
    for (int i = 0; i < 5; i++)
    {
        printf("第%d的值为 %d \n", i + 1, parry[i]);
    }
    return 0;
}
 

创建动态数组的好处
- 1、动态的决定数组的大小
 - 2、数组可以由程序员动态的创建和释放
 - 3、数组可跨函数使用
 
4、初始化内存空间
以mem开头的函数被编入字符串标准库,函数的声明包含在头文件string.h中
 
- memset:使用一个常量字节填充内存空间
 - memcpy:拷贝内存空间
 - memmov:拷贝内存空间
 - memcmp:比较内存空间
 - memchar:在内存空间搜索一个字符
 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int *parry = (int *)malloc(sizeof(int) * 5);
    if (parry == NULL)
    {
        exit(-1);
    }
    memset(parry, 0, sizeof(int) * 5);
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", parry[i]);
    }
    free(parry);
    return 0;
}
 

二、calloc函数
动态申请内存空间,并对其初始化
 
int *p=(int*)calloc(4,sizeof(int));
 
上述语句等价于
int *p=(int*)malloc(4*sizeof(int));
memset=(p,0,4*sizeof(int));
 
三、realloc函数
重新分配内存空间
 
int *ptr=NULL;
ptr = (int *)realloc(ptr, sizeof(int));//返回新的内存地址给ptr,ptr原本的值保存在新的内存空间
 
编写代码:让用户任意输入整数,输入一个整数,就动态添加一个内存空间,直到用户输入-1为止
 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int num = 0;
    int i = 0;
    int *ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        exit(-1);
    }
    while (1)
    {
        printf("请用户输入想要录入的数,输入-1跳出程序\n");
        scanf("%d", &num);
        if (num == -1)
            break;
        ptr[i] = num;
        i++;
        ptr = (int *)realloc(ptr, sizeof(int) * (i + 1));
        if (ptr == NULL)
        {
            exit(-1);
        }
    }
    for (int j = 0; j < i; j++)
    {
        printf("%d ", ptr[j]);
    }
    free(ptr);
    return 0;
}
 

















![[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用](https://img-blog.csdnimg.cn/img_convert/bad446c4802dc09d0660be5bb815c0a6.png)


