c语言函数可变长数组 c语言可变参数函数定义

C语言变长数组如何实现(接收用户数据的数组)你的想法是可以的 。
实际上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语言 可变长数组我就不看你的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;
【c语言函数可变长数组 c语言可变参数函数定义】printf("请输入数组长度:");
scanf("%d", n);
int a[n]; //修改
这个时候由于你在声明数组之前就已经读入n了,
所以a这个时候才是根据你输入的数字所得大小的数组 。
这样你懂我的意思了吗?
C语言可变长数组问题可变长数组只有执行了C99标准的编译器里才可以实现 ,  其他如VC6.0 VS编译器都没执行这个标准,所以没法使用可变长数组 , 只能动态分配数组 。
怎么用C语言定义一个无限长的数组?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分配一段新的内存空间以增大数组长度 。直到占满所有剩余空间 。
如果到占满所有空间还是无法存下数据,那么是硬件无法支持了 。

推荐阅读