• C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】


    1.可变参数(variable arguments):

    可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数。

    int func(int, ... )             (函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是 int,代表了要传递的可变参数的总数。)

    {

    . . .

    }

    调用的话:

    func(2, 2, 3);

    func(3, 2, 3, 4);    

    为了实现这些功能,使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。

    操作:

    a.创建一个 va_list 类型变量,然后使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。

    b.使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。

    c.使用宏 va_end 来清理赋予 va_list 变量的内存。

    2.浅谈内存管理:

    a.常用函数:

    <stdlib.h> 头文件里为内存管理提供了几个函数。 

    void *calloc(int num, int size);                     (在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。)

    void free(void *address);                     (该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。)

    void *malloc(int num);                    (在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。)

    void *realloc(void *address, int newsize);            (该函数重新分配内存,把内存扩展到 newsize)

    sub:  void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。关于void还有更多的资料:https://www.runoob.com/w3cnote/c-void-intro.html

    b.动态分配内存:

    编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您可以定义数组.

    但是,如果您预先不知道需要存储的文本长度,例如您向存储有关一个主题的详细描述。在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存.

     

    假如我们需要分配能储存200个char size的内存空间: description = (char *)malloc( 200 * sizeof(char) );

     

    sub:之所以要动态分配,是因为当动态分配内存时,您有完全控制权,可以传递任何大小的值。而那些预先定义了大小的数组,一旦定义则无法改变大小。

    c.释放和调整内存:

    当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。

     

    或者,您可以通过调用函数 realloc() 来增加或减少已分配的内存块的大小。

     

    description = (char *)malloc( 30 * sizeof(char) );    (初始分配)

    description = (char *) realloc( description, 100 * sizeof(char) );   (分配更大的内存)

     

     

    引用:https://www.runoob.com/cprogramming/c-variable-arguments.html

    https://www.runoob.com/cprogramming/c-memory-management.html

     

  • 相关阅读:
    关于==和equals的区别和联系,面试这么回答就可以
    (附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅
    [已解决]踩过的坑之mysql连接报“Communications link failure”错误
    JVM虚拟机----运行时数据区-------方法区
    JVM虚拟机------运行时数据区------堆
    JVM虚拟机-----运行时数据区-----本地方法栈
    JVM虚拟机栈------运行时数据区------方法的调用
    JVM虚拟机-----运行时数据区------动态链接
    JVM虚拟机栈------运行时数据区-------栈顶缓存技术
    JVM虚拟机-----运行时数据区-----JVM虚拟机栈-----操作数栈
  • 原文地址:https://www.cnblogs.com/cptCarlvon/p/11926042.html
Copyright © 2020-2023  润新知