本帖最后由 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页去找这个变量的声明。