精华内容
下载资源
问答
  • 创建变长数组类型 CREATE TYPE varray_type AS VARRAY(2) OF VARCHAR2(50); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的...
  • 主要介绍了C#使用List类实现动态变长数组的方法,涉及C#中List类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • C语言变长数组

    2021-05-22 10:56:40
    C语言变长数组我们知道,传统的C语言是不能像C++那样支持变长数组的,也就是说数组的长度是在编译期就确定下来的,不能在运行期改变。C99标准定义的C语言新特性,新增的一项功能可以允许在C语言中使用变长数组。C99 ...

    C语言变长数组我们知道,

    传统的

    C

    语言是不能像C++那样支持变长数组的,也就是说数组的长度是在编译期就确定下来的,不能在运行期改变。

    C99

    标准定义的

    C

    语言新特性

    ,新增的一项功能可以允许在

    C

    语言中使用变长数组。

    C99 gives C programmers the ability to use variable length arrays, which are arrays whose sizes are not known until run time. A variable length array declaration is like a fixed array declaration except that the array size is specified by a non-constant expression. When the declaration is encountered, the size expression is evaluated and the array is created with the indicated length, which must be a positive integer. Once created, variable length array cannot change in length. Elements in the array can be accessed up to the allocated length; accessing elements beyond that length results in undefined behavior. There is no check required for such out-of-range accesses. The array is destroyed when the block containing the declaration completes. Each time the block is started, a new array is allocated.

    以上就是

    C99

    标准

    C语言

    变长数组的说明.

    C语变长数组,测试所用的源代码很简单,如下所示:

    //文件名:dynarray.c

    //编译环境: bloodshed dev-c/c++ 4.9

    #include 

    #define bzero(b,len) (memset((b), '/0', (len)), (void) 0)

    intmain(intargc,char*argv[])

    {

    inti, n;

    n = atoi(argv[1]);

    chararr[n+1];

    bzero(arr, (n+1) *sizeof(char));

    for(i = 0; i 

    arr[i] = (char)('A'+ i);

    }

    arr[n] ='/0';

    printf("%s/n", arr);

    getchar();

    return(0);

    }

    上述程序名为dynarray.c,其工作是把参数argv[1]的值n加上1作为变长数组arr的长度,变长数组arr的类型为char。然后向数组中写入一些字符,并将写入的字符串输出。

    在支持c99标准的IDE上编译后, 在命令提示符下,运行:

    c:/c99_test/dynarray.exe 6

    将输出:

    ABCDEF

    展开全文
  • //零字节数组 } #pragma pack() 参考资料: 到此这篇关于C语言变长数组使用详解的文章就介绍到这了,更多相关C语言变长数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    看如下代码:

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len = 10;

    printf("The struct's size is %d\n",sizeof(SoftArray));

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    The struct's size is 4

    我们可以看出,_SoftArray结构体的大小是4,显然,在32位操作系统下一个int型变量大小刚好为4,也就说结构体中的数组没有占用内存。为什么会没有占用内

    存,我们平时用数组时不时都要明确指明数组大小的吗?但这里却可以编译通过呢?这就是我们常说的动态数组,也就是变长数组。

    先不要乱,让我们再看一段代码

    #include

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len = 10;

    SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray) + sizeof(int)*len);

    printf("SoftArray size is %d\n", sizeof(SoftArray));

    free(p);

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    SoftArray size is 4

    是不是有点奇怪,为什么申请了内存后结构体大小还是4呢?原因是动态申请的内存只是申请给数组拓展所用,从上个程序我们可以看出结构体的大小在创建时已经

    确定了,array明确来说不算是结构体成员,只是挂羊头卖狗肉而已。

    下面我们来看看关于变长数组的资料:

    1、什么是变长数组?

    变长数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。

    2、变长数组有什么用途 ?

    它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

    3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名

    本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们

    可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

    对于变长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    这样的变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发送1024字节的数据,如果用定长包,假设定长包的长度为2048,就

    会浪费1024个字节的空间,也会造成不必要的流量浪费。

    举个简单例子。

    #include

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len=10, i=0;

    SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*len);

    p->len=len;

    for(i = 0;i < p->len;i++) {

    p->array[i] = i+1;

    }

    for(i = 0;i < p->len;i++) {

    printf("%d\n", p->array[i]);

    }

    free(p);

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    注意,内存对齐字节偏移

    解决:资料【3】

    #pragma pack(1)

    struct node {

    int xxx;//4字节

    char yyy;//1字节

    char data[0];//零字节数组

    }

    #pragma pack()

    参考资料:

    到此这篇关于C语言变长数组使用详解的文章就介绍到这了,更多相关C语言变长数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • C语言可变长数组

    2021-03-15 16:57:07
    通常,数组变量的长度必须有常量表达式进行定义,但是在C99中,有时候也可以使用非常量表达式 1.代码演示: #include<stdio.h> int main(void){ int i, n; printf("你想颠倒多少个数字?"); scanf("%d",...
    前言:

    通常,数组变量的长度必须有常量表达式进行定义,但是在C99中,有时候也可以使用非常量表达式

    1.代码演示:

    #include<stdio.h>
    
    int main(void){
    	int i, n;
    	
    	printf("你想颠倒多少个数字?");
    	scanf("%d",&n);
    	
    //	printf("n=%d\n",n);//调试 
    	int a[n];//C99 only
    	
    	printf("请输入%d个整数:",n);
    	for(i=0;i<n;i++){
    		scanf("%d",&a[i]);//录入数字 
    	}
    	
    //	printf("n=%d\n",n);//调试 
    	printf("颠倒输出:");
    	for(i=n-1;i>=0;i--){
    		printf(" %d",a[i]);//空格分开数字 
    	} 
    	printf("\n");
    	
    	return 0;
    } 
    

    2.运行结果:

    你想颠倒多少个数字?12
    请输入12个整数:1 2 3 4 5 6 7 8 9 10 11 12
    颠倒输出: 12 11 10 9 8 7 6 5 4 3 2 1
    
    --------------------------------
    Process exited after 13.18 seconds with return value 0
    请按任意键继续. . .
    

    3.原理解释:

    • 上面程序的数组a[n]是一个变长数组(VLA),变长数组具有特征如下:
      1. 变长数组的长度是在程序执行时计算的,而非如常规那样在程序编译时计算
      2. 主要优点是不必在构造数组时随便给定一个长度,程序在执行过程中可以准确计算出所需元素个数,避免过长(浪费资源)或过短(溢出出错)。
      3. 变长数组的长度不一定要用变量来指定,任意表达式都可以
        int a[3*i+5];
        int b[j+k];
      4. 变长数组的主要限制是它们没有静态存储期限(下面详细讲)
      5. 变长数组没有初始化式(很自然,没有固定数量自然不能初始化)
      6. more……

    4.静态存储期限

    • 变量都是有存储期限的,也就是它们的生命周期,分为自动存储期限静态存储期限
    • 拥有自动存储期限的变量在所属块被执行时获得内存单元,并在块终止时释放内存单元。我们平时随手定义的变量都属于此范畴,生命周期在{}中。
    • 静态存储期限的变量则不需要考虑变量声明的位置,static变量只在程序执行时被初始化一次,然后全程都可以使用,存储位置一直没有改变,但是千万不要以为它和全局变量一样,局部静态存储期限的变量任然是块内可见,并且全局静态变量还限制了只有本源文件内可见,其他源文件不可见。总之,静态存储期限把变量的位置限制固定,但是并没有提升其可见区域。
    • 如下是一个静态数组的妙用,仔细体会:
    #include<stdio.h>
    void fillArry();
    
    int main(void){
    	
    	int i;
    	
    	for(i=0;i<12;i++)
    	{
    		fillArry(); //此处不需要填入任何传递值,也不需要任何返回值,降低了耦合性 
    	} 
    	return 0;
    }
    
    void fillArry(){
    	static int j=0;//用于自增 
    	static int a[12]={0};//用于记住上次调用的赋值
    	a[j]=j;
    	j++;//j=12时,数组已经赋值完毕 
    	while(j==12){
    		int i; 
    		for(i=0;i<12;i++){
    		printf("%d ",a[i]); //最后把静态数组输出,以验证每次调用都延续之前的结果	
    		} 
    		j++;
    		 
    	}	
    } 
    

    输出结果:

    0 1 2 3 4 5 6 7 8 9 10 11
    --------------------------------
    Process exited after 0.03233 seconds with return value 0
    请按任意键继续. . .
    
    • 以上是静态存储期限的妙用,静态存储期限变量会固定存储位置,这也就意味着,其存储由栈转移到静态存储区,可变长数组的长度都不固定,肯定没法放在固定的位置,这也从一个角度理解了为什么可变长数组不可以由静态存储期限。
    展开全文
  • 变长数组(VLA)

    2020-09-24 09:51:08
    处理二维数组的函数原型 #define COLS 4 int junk2(int ar[][COLS],int rows) ;//ar是rows*4的数组 处理n维数组的函数原型: int junkn(int arn[][4]...[5],int rows);/*arn是rows*4*...*5的数组*/ 通过以上两个...

    处理二维数组的函数原型

    #define COLS 4
    int junk2(int ar[][COLS]int rows) ;//ar是rows*4的数组
    

    处理n维数组的函数原型:

    int junkn(int arn[][4]...[5]int rows);/*arn是rows*4*...*5的数组*/
    

    通过以上两个函数原型,可以发现形参中,数组只有最左侧的参数可以变化。
    以二维数组为例,输入函数的数组一定是n4的数组,列数固定为4,行数被传递给形参rows。但是,如果要处理65的数组,由于列数不同,不能使用该函数,必须重新创建另一个列数为5的函数。因为C规定,数组的维数必须是常量,不能用变量来代替COLS
    要创建一个能处理任意大小二维数组的函数,必须把数组作为一维数组传递,然后让函数计算每行的开始出,比较繁琐。

    变长数组VLA

    对此,C99新增了变长数组(variable-length array,VLA),允许使用变量表示数组的维度,如下所示:

    int quarters = 4;
    int regions = 5;
    double sales[regions][quarters];  // 一个变长数组(VLA)
    

    变长数组有一些限制。变长数组必须是自动存储类别,这
    意味着无论在函数中声明还是作为函数形参声明,都不能使用static或extern存储类别说明符(第12章介绍)。而且,不能在声明中初始化它们
    注意,变长数组中的“变”不是指可以修改已创建数组的大小。一旦创建了变长数组,它的大小则保持不变。这里的“变”指的是:在创建数组时,可以使用变量指定数组的维度。因此,变长数组不能改变已有数组的大小。
    由于变长数组是C语言的新特性,目前完全支持这一特性的编译器不多。使用时,注意编译器是否支持。

    声明变长数组。
    如何编写一个函数,计算int类型的二维数组的所有元素之和。
    首先,要声明一个带二维变长数组参数的函数,如下所示:

    int sum2d(int rows, int cols, int ar[rows][cols]); // ar是一个变长数组(VLA)
    

    注意前两个形参(rows和cols)用作第3个形参二维数组ar的两个维度。因为ar的声明要使用rows和cols,所以在形参列表中必须在声明ar之前先声明这两个形参。
    C99/C11标准规定,可以省略原型中的形参名,但是在这种情况下,必须用星号来代替省略的维度:

    int sum2d(int, int, int ar[*][*]); // ar是一个变长数(VLA),省略了维度形参名
    

    其次,该函数的定义如下:

    int sum2d(int rows, int cols, int ar[rows][cols])
    {
    int r;
    int c;
    int tot = 0;
    for (r = 0; r < rows; r++)
    for (c = 0; c < cols; c++)
    tot += ar[r][c];
    return tot;
    }
    

    由于变量rows和cols代表行数和列数,所以该sum()函数现在可以处理任意大小的二维int数组。

    需要注意的是,在函数定义的形参列表中声明的变长数组并未实际创建数组。和传统的语法类似,变长数组名实际上是一个指针。这说明带变长数组形参的函数实际上是在原始数组中处理数组,因此可以修改传入的数组。
    变长数组还允许动态内存分配(第12章),这说明可以在程序运行时指定数组的大小。普通 C数组都是静态内存分配,即在编译时确定数组的大小。

    展开全文
  • 一些好的答案似乎取决于提前计算数组的最终大小。看起来这应该很简单,而且我是个新手,所以我可能只是搜索了错误的术语。。。在我的问题是:当数组长度未知且随时间变化时,如何让PyPlot刷新源于numpy数组的现有行...
  • C语言变长数组讲解

    万次阅读 多人点赞 2018-05-08 21:10:31
    C语言柔性数组讲解 看如下代码: #include&amp;amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;amp;gt; typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { ...
  • 主要介绍了C++ 手把手教你实现可变长数组实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组。 因此,windows上不支持以下程序(c98?),但linux gcc就支持(c99),
  • 如何在java中创建变长数组

    千次阅读 2019-04-22 16:58:42
    传统的数组创建 在java中我们都知道创建简单数组较为简单,和C很相似。如下是创建1、2、3维数组的代码。 int [] array = new int[5]; int [][] array = new int[5][5]; int [][][] array = new int[5][5][5]; 但是...
  • scala的变长数组

    千次阅读 2020-02-09 18:26:04
    变长数组 变长数组指的是数组的长度是可变的,可以往数组中添加、删除元素 定义变长数组 创建变长数组,需要提前导入ArrayBuffer类import scala.collection.mutable.ArrayBuffer 语法 创建空的ArrayBuffer变长数组...
  • 来自:ImportNew/覃佑桦 | 责编:乐乐 ... 有时我们希望将把数据保存在单个连续的数组中,以便快速、便捷地访问数据,但这需要调整数组大小或者对其...可变长原始类型数组需要自己实现。本文将展示如何实现 Java 可...
  • 默认的数组都是一维,“变长数组也是”。 只不过变长数组被定义为一个容器后,更容易实现对于数据的操作的。 易混淆点 一个数据对应多个数据,即一对多,那么就是一维度; 如果一个多,多里面仍然是一对多,那么...
  • Java可变长数组,看这篇就对了!

    千次阅读 2020-03-12 00:00:00
    变长数组设计 可变长数组包含两个组件: ResizableArray ResizableArrayBuffer ResizableArrayBuffer 包含一个大数组。该数组被划分为三个部分。一段用作小数组,一段用作中数组,一段用作大数组。ResizableArray...
  • C#变长数组

    千次阅读 2018-10-30 22:24:49
     ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:  动态的增加和减少元素  实现了ICollection和IList接口  灵活的设置数组的大小  ...
  • C++定义变长数组方法(两种方法)

    千次阅读 2020-10-27 17:18:39
    C++定义变长数组方法 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: #include<iostream>using namespace ...
  • 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术。下面是我在网上找到的一篇讲解很...
  • 变长数组(动态数组)

    万次阅读 2016-09-20 11:04:15
     这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array01.cpp #include using namespace std; ...
  • 变长数组 C99标准支持变长数组,允许在程序运行时再指定数组大小,但指定后就不能再变了。内存分配在栈上,超出命名空间的范围,自动释放内存。 动态分配内存 malloc/free 函数 是stdlib.h 的库函数。允许在程序运行...
  • C++变长数组

    万次阅读 多人点赞 2017-08-31 22:09:59
    什么是变长数组变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。 1.普通方式实现一维变长数组: #include using namespace std; int main() { int len; cin>>len; ...
  • 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 *...
  • linux kernel变长数组使用示例

    千次阅读 2020-05-25 20:03:49
    在一个结构体中,定义了长度为0的数组,而我们有希望这个变成数组和结构体是物理连续的,如图所示: 可以参考linux kernel的代码,如下所示: struct skcipher_sg_list { struct list_head list; int cur; ...
  • golang 之slice 变长数组

    千次阅读 2018-09-04 10:43:21
    slice:就是变长数组,主要是因为array(数组)长度不可变,导致在使用的时候存在诸多限制,才有了slice;slice 主要包含3个部分:1、指针 2、容量 3、长度 ,由于slice 的底层结构依然是数组,所以操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 435,655
精华内容 174,262
关键字:

变长数组

友情链接: tutorial-first-game.zip