精华内容
下载资源
问答
  • C++之变长数组与变长结构体

    千次阅读 2018-03-18 19:54:52
    在C99标准中,新加入了变长数组和变长结构体变长数组如下:其中a[n]就是变长数组,b[10]就是定长数组int main() { int b[10]; int n = 10; int a[n]; }该变长数组也可以对应于malloc的动态空间分配,等价于int *...

    在C99标准中,新加入了变长数组和变长结构体

    变长数组如下:其中a[n]就是变长数组,b[10]就是定长数组
    int main() {
        int b[10];
        int n = 10;
        int a[n]; 
    }

    该变长数组也可以对应于malloc的动态空间分配,等价于

    int *a = malloc(n * sizeof(int));


    二者的区别:
    1.变长数组从栈上分配空间,malloc从堆上分配空间;

    2.栈上分配和回收空间比堆上分配和回收空间要快;
    3.当n过大时,可能导致栈溢出,但malloc分配时不会。

    变长结构体:
    变长结构体是将数组放在结构体末尾,通过给变长结构体动态分配内存时,额外分配更多的空间做buffer。 值得注意的是,数组名是一个偏移量,本身不会占用空间,数组名代表的是一个不可修改的地址常量,但是我们对这个数组名指向的空间可以随意的指定。
    变长结构体分配额外的空间做buffer的例子如下:
    #include <stdio.h>
    #include <stdlib.h>
    struct v_struct { 
        int i; 
        int a[0];
    };
    
    int main() 
    { 
        v_struct *pv = (v_struct *)malloc(sizeof(v_struct)+sizeof(int)* 100); 
        pv->a[50] = 100; 
        printf("sizeof int is equal to %u\n", sizeof(int)); 
        printf("sizeof v_struct is equal to %u\n", sizeof(v_struct));
        printf("%u\n", sizeof(pv)); 
        return 0;
    }
    运行结果为,两者的大小均为4

    顺带打印了指针的大小,若机器是32寻址的,则指针大小为4字节,若机器是64位寻址的,则指针大小为8字节

    变长结构体的作用:

    1.变长结构体的变长部分通常可以用来作为buffer,缓存数据。

    2.变长结构体的空间释放是很方便的,只需要free(pv), 而且不会造成内存泄露。

    3.变长结构体使用起来更方便,不过,要小心越界。


    为何不用指针代替变长结构体?
    指针与变长结构体的区别:
    1.位置方面:指针可以放在任何地方,但是变长结构体的变长部分一定要放在结构体的尾部;

    2.内存占用方面:指针会占用一个指针大小的内存空间,但是变长数组不占内存,它只是一个占位符;
    3.内存布局方面:指针指向的内存和结构体的内存可以是不连续的,但是变长部分和结构体的内存必须是连续的。
    4.内存释放方面:使用指针,需要先释放指针所指向的内存,再释放整个结构体的内存,否则会造成内存泄漏;而使用变长结构体可以直接释放整个结构体的空间;
    5.限制方面:指针可以用在C++的类中,而变长结构体不可以。因为有些编译器会将一些额外的信息放在类的最后,比如vptr或者虚基类的内容,使用了变长的类,就会把这部分的值改变,这种行为是未定义的。

    参考博客:
    http://blog.csdn.net/SKY453589103/article/details/51147505
    展开全文
  • java变长参数,是怎样变长的?

    千次阅读 2018-07-29 13:20:41
    java方法支持变长参数。这样能够极大地简化我们的编程。我们看这样一段代码: public class Args { public static void main(String[] args) { String two = stringConcat("A", "B"); ...

    java方法支持变长参数。这样能够极大地简化我们的编程。我们看这样一段代码:

    public class Args {
        public static void main(String[] args) {
            String two = stringConcat("A", "B");
            String three = stringConcat("A", "B", "C");
        }
    
        public static String stringConcat(String... objs) {
             String sum = "";
             for (String s : objs) {
                 sum += s;
             }//for
             return sum;
        }
    }

    在JDK1.8.0_151的环境下,我们利用javac编译上面的源代码,得到Args.class字节码文件。

    利用javap反编译了Args.class字节码文件,截取StringConcat方法的反编译结果。如图:

    为什么会出现,arraylength指令,难道,变长参数和数组有什么关系?大胆假设,小心求证。

    我们借助于IDEA, 反编译Args.class字节码文件,以得到更直观的结果:

     请注意,我用红笔画出的部分。因为它证明了我的猜想,的确,变长参数是通过数组来实现的。

    再用jd-gui来看看反编译结果。

    看到标出重点的部分,jd-gui的反编译结果再次验证了我们的猜想。

    我们改写文章开头的代码,改成如下形式:

    public class Args {
        public static void main(String[] args) {
            String two = stringConcat("A", "B");
            String three = stringConcat("A", "B", "C");
            System.out.println(two);
            System.out.println(three);
        }
    
        public static String stringConcat(String... objs) {
             String[] arr = objs;
             int length = arr.length;
             String sum = "";
             for (int i = 0; i < length; i++) {
                 sum += arr[i];
             }//for
             return sum;
        }
    }

    同样,在JDK1.8.0_151环境下,我们尝试编译并运行这段代码,看它是否可以正常工作。

    如图:

    程序正常通过编译,并成功运行。 我们用【javap -c Args.class】反编译看看StringConcat方法:

    arraylength指令出现了。用IDEA反编译结果如下:

    除了那两行输出,其余是不是和前面的IDEA反编译结果一模一样。这也证明了我们的猜想。

    【结论】:java的变长参数,是java的一颗语法糖,其本质上是用数组形式来实现。

    展开全文
  • python - 变长参数 变长参数即参数个数不确定、参数类型不定的函数。 元组变长参数:适用于位置参数的不固定,但是在函数中使用这些参数时无需知道这些参数的名字的场合。元组变长参数用星号“ * ”表示。 字典...

    python - 变长参数

    变长参数即参数个数不确定、参数类型不定的函数。
    元组变长参数:适用于位置参数的不固定,但是在函数中使用这些参数时无需知道这些参数的名字的场合。元组变长参数用星号“ * ”表示。

    字典变长参数:适用于位置参数的不固定,而且在函数中使用这些参数时需要知道这些参数的名字的场合。字典变长参数用星号“ ** ”表示。

    # 元组变长参数
    def message(msg, *args):
        for arg in args:
            print(msg + ' comes from ' + arg)
    
    
    if __name__ == '__main__':
        message('jerry', 'Chongqing', 'Beijing', 'Shanghai')
    # jerry comes from Chongqing
    # jerry comes from Beijing
    # jerry comes from Shanghai
    # 字典变长参数
    def message(**kwargs):
        if 'price' in kwargs:
            price = int(kwargs['price'])
            if price >= 50:
                print('价格太昂贵,买不起!')
            else:
                print('价格还能接受,可以考虑!')
        else:
            print('无价之宝!')
    
    
    if __name__ == '__main__':
        message(price=200)
        message(price=10)
        message(title='北京欢迎您!')
    
    # 价格太昂贵,买不起!
    # 价格还能接受,可以考虑!
    # 无价之宝!
    展开全文
  • C语言变长参数表

    万次阅读 2018-05-05 11:04:34
    C语言变长参数表 标签(空格分隔): ANSI C 变长参数 标准输出 声明格式,如printf函数: int printf(char *fmt, ...) 其中,省略号表示参数表中的参数的数量和类型是可变的。**注意:省略号只能出现在...

    C语言变长参数表

    标签(空格分隔): ANSI C 变长参数 标准输出


    声明格式,如printf函数:

    int printf(char *fmt, ...)
    

    其中,省略号表示参数表中的参数的数量和类型是可变的。**注意:省略号只能出现在参数表的尾部,即函数的声明中必须至少有一个显式声明的参数,如printf中的char *fmt参数。

    变长参数表的使用(处理)

    1. #include <stdarg.h>
    2. va_list类型,va_start,va_argva_end

    stdarg.h头文件

    标准头文件<stdarg.h>中包含一组宏定义(即上述va_宏),它们对如何遍历参数表进行了定义。虽然该头文件的实现在不同的机器上的实现不同,但提供的接口是一致的。

    va_listva_start

    va_list是指针类型名,用于声明一个变量,该变量将依次引用各参数。由va_start将该变量初始化为指向第一个无名参数的指针。**注意:在使用va_list声明的变量之前,必须调用一次宏va_start。如:

    va_list ap;
    va_start(ap, fmt); /* 将ap指向fmt后的第一个无名参数 */
    

    va_arg

    每次调用va_arg,该宏都会返回一个参数,并将ap(va_list ap;)指向下一个参数。va_arg要求传入一个类型名来决定返回的对象类型、指针移动的步长。如:

    int ival;
    
    switch(*p++) {
    case 'd':
        ival = va_arg(ap, int);
        break;
    }
    

    va_end

    va_end负责完成一些必要的清理工作,必须在函数返回前调用。如:

    va_end(ap);
    

    公众号
    更多好玩的内容请关注我的公众号~会介绍一些 linux 上的效率工具,C 语言, linux 咨询以及 linux 内核源码学习。

    参考文献

    《C程序设计语言》(第二版)

    展开全文
  • scala的变长数组

    千次阅读 2020-02-09 18:26:04
    变长数组 变长数组指的是数组的长度是可变的,可以往数组中添加、删除元素 定义变长数组 创建变长数组,需要提前导入ArrayBuffer类import scala.collection.mutable.ArrayBuffer 语法 创建空的ArrayBuffer变长数组...
  • C语言变长数组

    千次阅读 2018-02-18 19:35:12
    我们知道,与C++等现代编程语言不同,传统上的C语言是不支持变长数组功能的,也就是说数组的长度是在编译期就确定下来的,不能在运行期改变。不过,在C99标准中,新增的一项功能就是允许在C语言中使用变长数组。然而...
  • c语言变长结构体

    千次阅读 2017-08-27 15:48:34
    1.什么是变长数组 struct MyData { int nLen; char data[0]; }; sizeof(MyData)=4; 可能有的编译器不支持char data[0];需要用char data[1];代替,这样上面结构体大小是sizeof(MyData)=8(字节对齐); 在上...
  • C++变长数组

    万次阅读 2017-08-31 22:09:59
    什么是变长数组? 变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。 1.普通方式实现一维变长数组: #include using namespace std; int main() { int len; cin>>len; ...
  • java可变长字符串

    千次阅读 2017-11-21 11:06:23
    在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");print("hello","张三", "alexia");下面...
  • Scala入门_变长数组

    千次阅读 2020-02-07 16:29:36
    变长数组 变长数组指的是数组的长度是可变的,可以往数组中添加、删除元素 定义变长数组 创建变长数组,需要提前导入ArrayBuffer类import scala.collection.mutable.ArrayBuffer 语法 创建空的ArrayBuffer变长...
  • Java数组可变长参数详解

    千次阅读 2018-02-01 15:42:46
    在java5中提供了可变长参数,也就是在方法中一个可变长参数可以代表同一类型的多个参数(数组);变长参数使用String...str标识; 1.向可变长参数方法传递多个参数 package extensions; public class ParamVar {...
  • C++可变长数组vector的使用

    千次阅读 2021-08-30 14:44:59
    最近在刷算法,C++里自带的一些容器、函数真是非常简便了。 下面介绍一种可变长的数组,和数组类似,但比数组更强大更方便~~~
  • 变长数组(动态数组)

    万次阅读 2016-09-20 11:04:15
    1.变长一维数组  这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array01.cpp #include using ...
  • pytorch中如何在lstm中输入可变长的序列

    万次阅读 多人点赞 2019-09-14 20:54:59
    pytorch中如何在lstm中输入可变长的序列pytorch中如何在lstm中输入可变长的序列torch.nn.utils.rnn.pad_sequence()torch.nn.utils.rnn.pack_padded_sequence()torch.nn.utils.rnn.pad_packed_sequence() pytorch中...
  • 变长编码

    千次阅读 2014-01-01 09:28:53
    Variable length coding and ...变长编码 Filed under: bitstream,CABAC,exponential golomb codes,H.264,variable-length coding :: Let’s say you want to write a number to a bitstream. The decoder is exp
  • C 可变长参数 VS C++11 可变长模板

    万次阅读 2014-07-03 13:50:32
    有些时候,我们定义一个函数,可能这个函数需要支持可变长参数,也就是说调用者可以
  • Lua变长参数详解

    万次阅读 2017-04-04 19:08:26
    Lua变长参数:  Lua支持变长参数,使用简单(借助于table、多重赋值), Lua中的函数还可以接受不同数量的实参。例如:在调用print时可以传入一个、两个或多个实参。参数中的三个点(...)表示该函数可接受不同数量...
  • 深入浅出变长结构体

    万次阅读 多人点赞 2013-09-22 21:44:29
    深入浅出变长结构体 1、 问题的引出  项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如如下的包头:88 0f 0a ob cd ef 23 00 。长度由头2个字节880f决定,考虑字节序,转为0f88,转为...
  • Java可变参数/可变长参数

    千次阅读 2016-10-20 10:52:32
    Java可变参数/可变长参数传递的参数不确定长度,是变长的参数,例如小例子:package demo; public class Demo { public static int sum(int n, int... nums) { for (int i = 0; i ; i++) { n = n + nums[i];...
  • 变长模板、变长参数是依靠C++11新引入的参数包的机制实现的。 一个简单的例子是std::tuple的声明: template class tuple; 这里的三个点“...”表示这个模板参数是变长的。 有了这个强大的工具,我们可以编写更加...
  • VS2015为什么用不了变长数组,用const定义的也不能用,什么编辑器才能用?求大神帮助![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/34.gif)
  • Kotlin的变长参数

    千次阅读 2017-12-01 12:03:45
    变长参数 定义:顾名思义变长参数就是某个参数可以接受多个值;在Kotlin里面位置可以随意放,而在java里面只能做最后一个。下面我们来一段代码展示一下效果:fun main(args: Array) { hell(1,2,3,4,5,6,string = ...
  • 解析变长结构体的用法和优点

    千次阅读 2017-05-14 10:08:06
    变长结构体:在接触变长结构体之前,以为会是一个很难理解的东西,但是这其实算是C里面的一种技巧吧,优点是:分配了一段连续的内存,防止内存碎片化以及方便内存的管理。使用变长结构体的格式如下:struct Test { .......
  • 上一节讲述了如何创建具有变长参数的函数和如何读取变长参数,其操作都在函数内完成,本节将讲述把变长参数列表整体作为参数传递给其他函数的方法。 变长参数传递的函数族如下:   #include int ...
  • 长度子网掩码(VLSM)

    万次阅读 多人点赞 2018-02-28 15:40:48
    一、VLSM(Variable Length Subnet Mask,可长度子网掩码)规定了如何在一个进行了子网划分的网络中的不同部分使用不同的子网掩码。VLSM其实就是相对于类的IP地址来说的。A类的第一段是网络号(前八位),B类地址...
  • pytorch rnn 变长输入序列问题

    千次阅读 2019-04-26 02:35:54
    pytorch实现变长输入的rnn分类 输入数据是长度不固定的序列数据,主要讲解两个部分 Data.DataLoader的collate_fn用法,以及按batch进行padding数据 pack_padded_sequence和pad_packed_sequence来处理变长序列 ...
  • Javascript 函数变长参数(…rest)

    千次阅读 2018-10-19 18:06:27
    在C/C++中 有argc argv可以传入变长参数给程序。在node有时就会遇到这个需求。 在ES5中可以使用arguments对象了。 在ES6标准中引入了 rest 参数(形式为…变量名),用于获取函数的多余参数。rest 参数搭配的变量是...
  • C语言变长数组讲解

    万次阅读 2018-05-08 21:10:31
    变长数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。 2、变长数组有什么用途 ? 它的主要用途是为了满足需要变长度的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,566,626
精华内容 626,650
关键字:

如何变长