C语言怎样定义变长数组

Python014

C语言怎样定义变长数组,第1张

”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)

写全的话应该是

int x = 2   //x定义并赋值,当然不一定是2

char array[x]

测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc 3.2.2也可以正确编译。

你的想法是可以的。

实际上C提供一个标准的库函数可以实现这个功能。

void *realloc(void *mem_address, unsigned int newsize)

譬如:

int *p = malloc(sizeof(int)*3)

p[0]=0p[1]=1p[2]=2

p = realloc(p, sizeof(int)*4)

这个时候,p指向的前三个int的值还是1、2、3,而且可以对第四个int赋值了。realloc会自动把原来的数据复制到新的内存空间上去。

我就不看你的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这个时候才是根据你输入的数字所得大小的数组。

这样你懂我的意思了吗?