-
2022-02-24 14:11:20
最近在和小伙伴讨论编程题的时候,她写的代码在我的VS2019上并不能运行,代码如下
int n = 10; int arr[n];
VS2019给的错误是创建数组必须用常量。但是在很多oj系统,以及Dev上都可以运行这段代码。
在查阅资料后,我有了一些初步想法。在C99标准中,引入了一个新概念“变长数组”,变长数组允许使用变量创建数组,但是不能在创建数组的时候进行初始化操作。但是C99这一标准并没有流行开来,以致于在VS2019中不支持C99,也就不支持变长数组。Dev等由于支持这一标准,因而可以编译。但无论如何,下面的代码总是错误的。
int n = 10; int arr[n] ={0}; //创建变长数组时不能初始化
更多相关内容 -
C语言 VS2017不支持变长数组
2019-06-10 10:30:42#include<stdio.h>//传统方式和变长方式 void T_trots(double ar[],int n);...//VS不支持变长数组 int main(void) { double trots[20]; short clops[10][30]; long shots[5][10][15];...#include<stdio.h>//传统方式和变长方式 void T_trots(double ar[],int n); //void Vla_trots(int n, double ar[n]);//VS不支持变长数组 int main(void) { double trots[20]; short clops[10][30]; long shots[5][10][15]; T_trots(trots, 20); // Vla_trots(20, trots); return 0; } void T_trots(double ar[], int n) { int i; printf("tradional trots says:\n"); for(i = 0;i < n;i++) { ar[i] = i+1; printf("%.lf ",ar[i]); } printf("\n"); } /*void Vla_trots(int n, double ar[n]) { int i; printf("vla trots says:\n"); for(i = 0;i < n;i++) { ar[i] = i+1; printf("%.2f ",ar[i]); } printf("\n"); }*/
Cprimer上的10章练习题第12题,分别以传统方式和变长数组方式写函数声明和函数调用。
实际上变长数组在C11中被列为可选,在C99中支持,但VS的编译器只对C++适用,变长数组部分编译器不适用,gcc可用。 -
C++ 手把手教你实现可变长的数组实现
2020-08-25 08:06:42主要介绍了C++ 手把手教你实现可变长的数组实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
C语言变长数组
2021-05-22 10:56:40C语言变长数组我们知道,传统的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
-
C语言变长数组使用详解
2021-02-06 14:55:44//零字节数组 } #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",... -
C语言变长数组 struct中char data[0]的用法详解
2020-12-25 18:46:53在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。 struct MyData { int nLen; char data[0];}; 在结构中,data是一个数组名;但该数组... -
C语言中的变长数组
2018-04-06 22:14:44学过C语言和C++的人都知道,我们在定义数组时用的都是整型的常量,那么大家有这样去定义过一个数组吗? #include <stdio.h> int main(int argc, char **argv) { int c, d,i,j; scanf("%d %d... -
C99中的可变长数组
2020-12-22 20:48:33在C99标准中开始支持可变长数组,即在声明数组时可以用变量来指示数组的大小,而不一定是常量表达式。 看下面的示例程序: #include <stdio.h> int main(int argc, char **args) { int n = 5; if (argc &... -
变长数组VLA
2019-10-11 15:05:10C99标准中,支持变长数组,即方括号[]中可以用为一个变量,但是很多编译器并不能很好地支持。 c++11标准中,不支持变长数组,即方括号[]中必须为常量表达式。 c++标准支不支持变长数组,并不重要,因为完全可以... -
浅谈c语言数组及可变长数组
2020-11-07 00:19:25可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组。 因此,windows上不支持以下程序(c98?),但linux gcc就支持(c99), -
可变长度的数组(定义数组时长度为0)
2019-04-16 08:36:52转自 https://blog.csdn.net/qq_39736982/article/details/82849769 https://www.cnblogs.com/hwy89289709/p/6840196.html ... 在标准C和C++中,长度为0的数组是被禁止使用的。不过在GN... -
C#变长数组
2018-10-30 22:24:49ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和IList接口 灵活的设置数组的大小 ... -
C++定义变长数组方法(两种方法)
2020-10-27 17:18:39C++定义变长数组方法 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: #include<iostream>using namespace ... -
C++ 可变长数组类的实现
2022-03-29 21:32:22可变长数组类的实现 成员变量:size表示元素的个数,ptr指针指向动态分配的数组 成员函数:拷贝构造函数,析构函数释放空间 重载运算符 '=' 用于对象间的赋值 重载运算符“[]” 用以支持根据下标访问数组元素 '... -
变长数组(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的数组*/ 通过以上两个... -
C++变长数组
2017-08-31 22:09:59什么是变长数组? 变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。 1.普通方式实现一维变长数组: #include using namespace std; int main() { int len; cin>>len; ... -
关于C/C++是否支持定义不定长数组
2021-02-10 11:52:00因此,G++支持不定长数组完全是因为它同时支持C99和C++(对C99标准支持得最好的就是G++了),而VS不怎么支持C99标准那是人尽皆知的,也就理所当然不支持C99的不定长数组了。另外Turbo C 3.0不支持是因为它非常古老,... -
C++数组维度与C99的变长数组(VLA)
2019-05-20 22:01:43看到这样的操作,我没有继续看其他的代码,就直接指出了他的这个问题,我说这种静态数组在编译期就要确定内存大小,你这样肯定有问题,他表示不信,后来他的程序问题找到了并且告诉我,他的这种写法没问题,我当时就... -
[C]变长数组
2018-09-28 12:49:48变长数组在C99及C11的标准中支持,严格讲在C++的所有标准中都不支持变长数组,只是各家编译器对语言的扩展 //t.c #include<stdio.h> int foo(int n){ int x[n]; printf("%lu\n",sizeof... -
C语言变长数组之剖析
2018-11-23 15:46:002019独角兽企业重金招聘Python工程师标准>>> ... -
第六章 C语言数组_C语言变长数组:使用变量指明数组的长度
2022-02-20 17:11:03在《C语言的三套标准:C89、C99和C11》一节中我们讲到,目前经常使用的...各种编译器都能很好地支持 C89 标准,但对 C99 的支持却不同:开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 -
变长数组和动态内存分配
2019-06-17 22:55:15C99中支持变长数组,即支持数组在定义时以一个变量来声明长度; int i; int n; scanf("%d",&n); int arrat[n]; //用 一个变量来声明数组长度 for(i=0;i<n;i++) { arrat[i]=i+1; } ... -
变长数组与动态分配内存数组
2019-10-08 21:58:19C99标准支持变长数组,允许在程序运行时再指定数组大小,但指定后就不能再变了。内存分配在栈上,超出命名空间的范围,自动释放内存。 动态分配内存 malloc/free 函数 是stdlib.h 的库函数。允许在程序运行时指定... -
浅析变长数组(VLA)和动态数组
2017-12-30 09:40:00前天实训听见几位推免的大佬聊面试中出现了动态数组,而我们所学并没有涉及到动态数组,遂翻起了尘封已久的《C语言程序设计现代方法》以及...一、C99中的变长数组 下面程序用到了变长数组 #include<... -
变长数组-C99新特性
2013-12-11 11:51:04C99允许我们在任何地方定义变量,并且支持不定长数组的定义,即,我们可以使用变量来定义我们的数组。这就使得我们可以在程序运行过程中根据实际需要来定义数组长度。 摘自... -
C语言中变长数组的使用方法
2019-01-13 20:19:14C语言中变长数组的使用方法