C语言 可变长数组

这是错误的代码

//求一组数据中的最大值
#include <stdio.h>
#include <stdlib.h> //system()
int main(void)
{

int n=1, a[n], i=0, j=0, k=0;
printf("请输入数组长度:");
scanf("%d", &n);
for( i = 0; i < n; i++ ) //输入数组元素值
{
printf("%d=", i+1);
scanf("%d", &a[i]);
}
for( j = 0; j < ( n-1 ); j++ ) //起泡法
for( i = 0; i < ( n - 1) - j ; i++ )
if(a[i] < a[i+1])
{
k = a[i];
a[i] = a[i+1];
a[i+1] = k;
}
printf("按由大到小排列为:\n");
for( i = 0; i < n; i++ )
printf("%d\n", a[i]);
printf("此数列最大值为:%d\n", a[0]);
system( "pause" );
return 0;
}
我如果这么写的话,如果输入15,则程序运行错误,但是如果我将数组的声明改一下位置的话就没事了,请问是什么原因?

//求一组数据中的最大值
#include <stdio.h>
#include <stdlib.h> //system()
int main(void)
{

int n=1, i=0, j=0, k=0;
printf("请输入数组长度:");
scanf("%d", &n);
int a[n]; //修改
for( i = 0; i < n; i++ ) //输入数组元素值
{
printf("%d=", i+1);
scanf("%d", &a[i]);
}
for( j = 0; j < ( n-1 ); j++ ) //起泡法
for( i = 0; i < ( n - 1) - j ; i++ )
if(a[i] <= a[i+1])
{
k = a[i];
a[i] = a[i+1];
a[i+1] = k;
}
printf("按由大到小排列为:\n");
for( i = 0; i < n; i++ )
printf("%d\n", a[i]);
printf("此数列最大值为:%d\n",a[0]);
system( "pause" );
return 0;
}

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

这样你懂我的意思了吗?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-04
你放scanf函数前面,就表示申明了只有一个元素的数组,而放在它后面,就表示数组大小是随着你输入的数字 的不同而变化的,放前面之所以出错时数组溢出越界了
第2个回答  2013-01-04
你后面这个程序也是有问题的,只是“碰巧”可以运行而已。

这个“碰巧”的意思是你的程序只有一个main函数,且你在声明了int a[n]之后没有声明别的变量,这样当你用a[14]访问到越界的数组的时候也能按照你的预想运行,不信的话可以在int a[n]之后声明别的变量,并在“printf("按由大到小排列为:\n");” 这个语句之前去改变它的值,这样肯定就会改变到数组a里面元素的值。
实际编译器在编译下面的程序的时候,预先只是按n=1来给数组a分配了一个int空间而已。

你的程序应该要用malloc/free来动态申请数组a的内存空间,记得使用完后并释放它。追问

那可变长数组应该怎样写呢?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网