C语言 可变长数组
”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)
写全的话应该是
int x = 2; //x定义并赋值,当然不一定是2char array[x];测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc 3.2.2也可以正确编译。
在C语言中,数组的大小是在定义的时候就需要确定的,不然编译的时候进行分配内存时,会使计算机不知道该分配多少内存单元而报错。
然而,可以根据定义一个链表来达到可变的效果。
链表节点定义如下:
struct{ int data; // 数据域 struct node *next; // 指针域} *node;struct node head, p;head->data = 4;head->next = p;p->data = 5;类似的可以将一个节点看成是数组中的一个元素,需要增加元素的时候,就增加链表的节点就可以了。
你第一种写法:
int n=1, a[n], i=0, j=0, k=0;
这里你已经定义n = 1, 而a[n]也在该行定义。
那么编译器在此就直接给a这个数列分配内存了。
也就是说你a这个数组大小就确定了,即为1。
我不知道你学了内存分配没有,简单给你讲解一下,
具体你可以在网上搜。
比如一个含有5个整数类型的数组可以这样定义a[5],
但是也可以这样获得:int *a = (int *) malloc ( sizeof( int ) * 5 );
也就是说我们给一个指针分配了内存,从而得到一个数组,
而a[5]这样定义也是需要编译器在编译程序的时候分配内存的
而编译器会根据你的代码优化你的程序,并把代码转化为汇编再者machine code
说多了,继续给你分析
你修改过的代码
int n=1, i=0, j=0, k=0;
printf("请输入数组长度:");
scanf("%d", &n);
int a[n]; //修改
这个时候由于你在声明数组之前就已经读入n了,
所以a这个时候才是根据你输入的数字所得大小的数组。
这样你懂我的意思了吗?
你放scanf函数前面,就表示申明了只有一个元素的数组,而放在它后面,就表示数组大小是随着你输入的数字 的不同而变化的,放前面之所以出错时数组溢出越界了
你后面这个程序也是有问题的,只是“碰巧”可以运行而已。
这个“碰巧”的意思是你的程序只有一个main函数,且你在声明了int a[n]之后没有声明别的变量,这样当你用a[14]访问到越界的数组的时候也能按照你的预想运行,不信的话可以在int a[n]之后声明别的变量,并在“printf("按由大到小排列为:\n");” 这个语句之前去改变它的值,这样肯定就会改变到数组a里面元素的值。
实际编译器在编译下面的程序的时候,预先只是按n=1来给数组a分配了一个int空间而已。
你的程序应该要用malloc/free来动态申请数组a的内存空间,记得使用完后并释放它。
C语言可变长数组在GCC编译器中的实现
在C99中新加入了对变长数组的支持,即数组的长度可以由某个非const变量来定义。可变数组的空间大小直到程序运行时才能确定,因此只有程序在运行时才能为程序分配空间。在gcc编译器程序会在运行时根据实际指定的大小(变量当前的值)调节esp的值,为数组在栈上分配适当大小的空间。由于要在运行时才能为数组分...
C语言 可变长数组
int n=1, a[n], i=0, j=0, k=0;这里你已经定义n = 1, 而a[n]也在该行定义。那么编译器在此就直接给a这个数列分配内存了。也就是说你a这个数组大小就确定了,即为1。我不知道你学了内存分配没有,简单给你讲解一下,具体你可以在网上搜。比如一个含有5个整数类型的数组可以这样定义a...
如何声明可变长度的数组 C语言
C99允许用变量做数组下标,也就是可以声明可变长度的数组,但是据我所知,目前还没有C99标准的编译器!VC也不是。但你可以用一个宏定义做嘛,改的时候改宏定义那一个地方就可以了。
c语言变长数组
int main(){ unsigned char n;for(n=0;n<10;n++){ char x[n]; \/\/注意变长数组必须在程序块内定义,不能在文件内定义 x[n]=n;printf("%d",x[n]);fflush(stdout);} return 0;} GCC实测通过
C语言实现一个可变长的二维数组
scanf("%d",&a);int **p=new int*[a];int *n=new int[a];for (int i=1;i<=a;i++){ printf("请输入第%d行元素的个数:",i);scanf("%d",&n[i-1]);printf("\\n");int q=n[i-1];p[i-1]=new int[q];for (int j=0;j<n[i-1];j++){ p[i-1][j]=1;} }...
C语言支持可变长数组吗,如果可以请举例书名。谢谢
c99以前的版本是没有的,数组大小必须是常量或者是常量表达式,c99版本才加入变长数组,如:int add(int n){ int a[n];...} 即使它叫做变长数组,但是数组大小一旦确定就不能改变了。很多书里面都有介绍,如《深入理解计算机系统》
c语言中是否支持变长数组?
1、C语言中不支持。C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用。做为解决方案,你可以使用C式的malloc函数或者C++式的new函数来在堆上动态分配内存,这样长度是完全可以自定的。2、C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供...
【究根源】详解C语言变长数组
在某些特殊场景,如Redis的SDS数据结构中,0长度数组展现出了其实际价值。值得注意的是,编译器在处理0长度数组时会进行优化,尽量减少其在内存中的实际占用。关于数组和指针的存储机制,C语言中有显著的区别:例如,虽然我们可以用&arr[0]来定义arr,但char a[1]中'a'实际上是常量,而char *b是一...
C语言中怎样定义一个可变大小的数组呢?我想根据自己的需要输入数组的大...
定义动态数组,例如:include <stdio.h> include <stdlib.h> int len;char *str;printf("输入数组的长度:");scanf("%d",&len);str=(char*)malloc(len*sizeof(char));为str分配分配len个字符大小的空间。
C语言里面,先输入n等于几,在下面定义数组时用a[n]可以吗?
这叫可变长数组(Variable-length array),需要编译器支持C99标准 C99标准前不支持这样的写法,数组定义时必须是整型常数