重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)
在播州等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都网站设计 网站设计制作按需设计网站,公司网站建设,企业网站建设,品牌网站设计,全网整合营销推广,成都外贸网站制作,播州网站建设费用合理。
写全的话应该是
int x = 2; //x定义并赋值,当然不一定是2
char array[x];测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc
3.2.2也可以正确编译。
如果一个数组具有动态存储周期(也就是说,如果在语句块内定义数组,并且没有 static 修饰符),那么 C99 也允许把非常量表达式作为元素数量来定义该数组。这样的数组被称为长度可变数组(variable-length array)。
而且,长度可变数组的名称必须是普通的标识符。长度可变数组不能作为结构或联合的成员。在下面的示例中,只有 vla 数组的定义是合法的:
void func( int n ){int vla[2*n]; // 合法:存储周期为动态的static int e[n]; // 非法:长度可变数组不可有静态存储周期
struct S { int f[n]; }; // 非法:f不是一个普通标识符/* ... */}
你的想法是可以的。
实际上C提供一个标准的库函数可以实现这个功能。
void *realloc(void *mem_address, unsigned int newsize);
譬如:
int *p = malloc(sizeof(int)*3);
p[0]=0;p[1]=1;p[2]=2;
p = realloc(p, sizeof(int)*4);
这个时候,p指向的前三个int的值还是1、2、3,而且可以对第四个int赋值了。realloc会自动把原来的数据复制到新的内存空间上去。
C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。
比如int a[] = {1,2,3,4,5}; 数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。
但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。
1 由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。
通过下面例子来理解该方法:
#include stdio.h
#include stdlib.h
int main()
{
int size=100;//最初为100个元素空间。
int *a = NULL;
int i = 0;
a = malloc(sizeof(int) * size);
if(a == NULL) return -1;
while(scanf("%d", a+i) == 1)//循环向a中输入数据,直到输入非数值字符为止
{
i++;
if(i == size)//数组空间不足
{
size *=2; //将数组空间扩大二倍, 也可以改用size+=100;之类的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空间
if(a==NULL)
{
return -1;//这种情况下运行载体(如PC)内存不足以提供,中断程序。
}
}
}
if(a) free(a);//对申请的内存进行释放。
return 0;
}
从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。 直到占满所有剩余空间。
如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。
所以这种方法可以做到软件意义上的无限大数组空间。
但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。
2 事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。
int main()
{
unsigned char n;
for(n=0;n10;n++)
{
char x[n]; //注意变长数组必须在程序块内定义,不能在文件内定义
x[n]=n;
printf("%d",x[n]);
fflush(stdout);
}
return 0;
}
GCC实测通过
我就不看你的bubble sort的算法部分了,直接跟你讲你不知道错误的原因。
你第一种写法:
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这个时候才是根据你输入的数字所得大小的数组。
这样你懂我的意思了吗?