首页 > 其他分享 >C语言-malloc学习

C语言-malloc学习

时间:2024-02-03 18:01:42浏览次数:35  
标签:malloc int C语言 学习 num 空间 NULL ptr

学习网址

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学习_#动态内存空间

C语言-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学习_c函数_03

标签:malloc,int,C语言,学习,num,空间,NULL,ptr
From: https://blog.51cto.com/youyeye/9570035

相关文章

  • C语言解题||杨氏矩阵
    题目:请编写一个程序,在杨氏矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);杨氏矩阵 :一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的。代码实现:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>structpoint{ intx; inty;......
  • C语言学习9
    前面写float的数据类型后,输入0.0,编译器默认是double类型的变量,后加f才是floatgoto语句上述例子死循环,goto=飞雷神苦无.....但使用多了,程序出现的BUG也会增多,其次也不能跨函数跳转,如下:真正适用场景例子:预备:shutdown-s:关机,shutdown-t:定时关机,(注意空格);shutdown-a:取消关机左上角注:......
  • Pandas库学习笔记(4)---Pandas DataFrame
    PandasDataFrame  PandasDataFrame基本操作DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐。DataFrame的功能潜在的列是不同类型的大小可变标记的轴(行和列)可以对行和列执行算术运算结构体pandas.SeriesSeries结构如下: 让我们假设我们正在使用学生的数......
  • c语言小练习——字符串长度、拷贝、拼接、比较
    /* 使用c语言知识实现下面程序: 1,实现strlen函数的功能 2,实现strcpy函数的功能 3,实现strcat函数的功能 4,实现strcmp函数的功能 不允许使用已有的str函数*/1#define_CRT_SECURE_NO_WARNINGS2#include<stdio.h>3#include<string.h>4#include<stdbool.h>5#......
  • [算法学习笔记] 欧拉路
    免责声明:本文定义并不严谨,笔者是从“浅显易懂”的角度出发写本文。若您需要严谨定义请移步至其他学术文章。基本定义欧拉路径,即能不重不漏经过图上所有边的路径。也可以说“一笔画问题”。特殊地,如果这条路径的起点和终点一致,则这条路径叫做“欧拉回路”。其他的定义:欧拉图......
  • Java套接字编程学习
    一、前言Java套接字编程用于不同JRE上运行的应用程序之间进行通信,可以是面向连接或无连接的。Socket类和ServerSocket类用于面向连接的套接字编程,DatagramSocket类和DatagramPacket类用于无连接的套接字编程。我们需要根据服务器IP地址和端口号来区分套接字。Socket类用于客户端和......
  • Pandas库学习笔记(3)---Pandas Series
    PandasSeriesPandasSeries基本操作pandas.SeriesSeries结构如下:pandas.Series(data,index,dtype,copy)构造函数的参数如下-data:数据采用各种形式,例如ndarray,list,常量index:索引值必须是唯一且可哈希的,且长度与数据相同。如果未传递索引,则默认为np.arrange(n)。dt......
  • Postman学习第2天心得记录
    经过昨天的学习,我对Postman有了基本的了解。今天,我进一步深入探索了它的功能和用法。今天的学习重点是如何利用环境变量、集合和测试脚本提升测试效率。环境变量允许我为不同的环境(如开发、测试、生产)设置不同的值,这样我就可以在不更改代码的情况下轻松切换环境。通过创建集合,我可......
  • C语言解题||字符串左旋
    题目:实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋1个字符得到BCDAABCD左旋2个字符得到CDAB代码实现:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>#include<string.h>//除第1个外,全部往前1位,然后原第1个填充至极右voidLeft_reverse(......
  • pygame学习(一)——pygame库的导包、初始化、窗口的设置、打印文字
    导语 pygame是一个跨平台Python库(pygamenews),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。使用pygame,理论上可以开发设计市面上所有的2D类型游戏。优点:pygame免费、开源,支持多种操作系统,具有......