本帖最后由 Croper 于 2019-4-13 00:30 编辑
楼主说的是变长数组(vla)吧,
变长数组和动态数组是两个概念,虽然我感觉也很容易搞混,
问题在于,变长数组这个名字很有误导性,它只是在编译时其数组长度不是常量表达式,长度是变量,
并不是在运行时”变长”的,也就是说,它一旦声明,长度就是固定的。
而你在声明a[k]时,k并没有给予初始值,因此,它的长度你就没法确定。 并且极大可能在赋值的时候发生了越界。从而得到了意外的结果。
因此,你应该把声明a[k]的位置放到k赋值之后,像这样:
- #include <stdio.h>
- int main()
- {
- int k,t, i, j;
- scanf("%d",&k);
- int a[k];
-
- for(i = 0; i < k; i++)
- scanf("%d",&a[i]);
- putchar('\n');
- for(j = 0; j < k-1; j++)
- for(i = 0; i < k-1-j; i++)
- if(a[i] > a[i+1])
- {
- t = a[i];
- a[i] = a[i+1];
- a[i+1] = t;
- }
-
- for(i = 0; i<k; i++)
- printf("%d ",a[i]);
-
- return 0;
- }
复制代码
另外,把所有变量在函数开头时进行声明并不是一个好习惯。这种写法只是从c89留下来的习惯而已。现在更推荐在使用变量前再声明变量。这样的程序更有可读性,在实现一个较长的函数时,你也不用在看到一个变量时翻N页去找这个变量的声明。