学习网址

C语言动态内存函数(malloc、calloc、realloc、free)详解:https://www.jb51.net/program/295325hjh.htm

C语言动态内存函数详解:https://www.jb51.net/article/223725.htm


在C语言中,动态内存函数是块重要的知识点,以往,我们开辟空间都是固定的。

数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了。

看完本章就能向内存申请动态空间。

一、malloc函数

需要头文件:<stdib.h>

C语言-malloc学习_#malloc

C语言-malloc学习_#malloc_02

malloc函数(开辟 动态内存 的函数):

void* malloc(size_t size);
  • 功能:
  • 这个函数向内存申请一个连续可用的空间,并返回指向这块空间的指针。
  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。【判断malloc == NULL】
  • 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。【就是让使用者自己定义开辟空间使用的是什么数据类型】
  • 如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
  • malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。【说白了就是:使用malloc申请空间后,当程序退出时才会把这块内存释放;不退出程序的话要手动释放(显式释放)就要用free函数】
  • malloc申请的内存空间: malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容。
  • 举个例子:

申请int类型的空间(数组形式)

#include <stdio.h>
#include <stdlib.h>
int main()
{
//变长数组的知识点(vs不能用,gcc可以用)
    //int num = 0;
    //scanf("%d", &num);
    //int arr[num] = { 0 };
    int* ptr = NULL;
    ptr = (int*)malloc(40);
    if (ptr == NULL)//判断ptr指针是否为空,也就是查看malloc有没有申请空间成功
    {
        perror("malloc");
        exit; 
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)//给开辟的空间赋值
            ptr[i] = i + 1;
    }
    free(ptr); //释放ptr指向的空间
    ptr = NULL;//让ptr指向空
    return 0;
}

/*
这段代码首先包含了<stdio.h>和<stdlib.h>头文件,分别提供了输入输出和动态内存分配的功能。
在注释部分,有一段代码尝试使用输入变量来创建可变数组,但是这种写法在Visual Studio中不支持,而在GCC编译器中可以使用。
接下来,声明了一个整型指针ptr并将其初始化为NULL。然后使用malloc函数动态分配了10个整数的内存空间(单个int类型的内存大小为4,所以40/4=10个),并将返回的地址赋给了ptr。
然后进行判断ptr的值:
	如果分配失败,即ptr为NULL,则打印错误信息并退出程序。
	如果分配成功,就进入else分支。在这个分支中,通过循环将1到10的值赋给数组的前10个元素。注意,这里的数组大小是固定的,而不是根据用户输入来确定的。
最后,使用free函数释放了ptr指向的内存空间,并将ptr设置为NULL,以避免出现悬挂指针的问题。
整个程序的目的是演示如何动态分配内存来创建一个整数数组,并对其中的元素进行赋值操作。
*/


/*-------- SOP - 举一反三 --------*/
// 下面的程序让用户输入一个数值,用做malloc申请的空间大小
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int num = 0;
    printf("请输入你要申请的空间大小(int类型):");scanf("%d", &num);
	int* ptr = NULL;
    ptr = (int*)malloc(num);
    printf("ptr的长度为%d个int数\n",num/sizeof(int)); // 查看开辟的空间大小 
    printf("单个int类型的内存大小:%d\n",sizeof(int)); // 查看int内存大小    
    if (ptr == NULL){    //判断ptr指针为空,malloc有没申请空间成功 
        perror("malloc");
        exit; 
    }else{
        int i = 0; printf("下面输出ptr空间里面的变量数据:\n");
        for (i = 0; i < num/sizeof(int); i++)//给开辟的空间赋值
        {    ptr[i] = i + 1;
             printf("%d  ",ptr[i]);
		}        	
    }
    free(ptr); // 释放ptr指向的空间
    ptr = NULL;// 让ptr指向空
	return 0; 
}

C语言-malloc学习_#stdib_03