302班

java突击队
posts - 151, comments - 74, trackbacks - 0, articles - 14
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C语言中的变量长度数组

Posted on 2007-07-01 10:40 停留的风 阅读(1632) 评论(0)  编辑  收藏 所属分类: C语言学习历程

有的书上是这样写的:
#include <stdio.h>
int main (void)
{
int test;
printf ("OK/n");
scanf ("%i",&test);
unsigned long long int aa[test];
printf ("aa[test]=%i/n",aa[test]);
retrun 0;
}
我按照书上说的那样声明可变长度的数组,为什么不能编译呢?
书上的格式是这样的:unsigned long long int aa[test]

c99的编译器才支持这种可变数组
如果你不是c99的编译器
那你只要使用
#define test **来进行常量定义

《Programming in C》,里面讲数组时讲到了“变量长度数组”,说有的编译器支持这样的用法:

int i=10;
char buf[ i ];

测试发现VC6是不支持这个的,但是GCC支持!我写了这样的测试代码:
发现程序居然也支持i是负数,而且在负数的情况下,GCC的内存分配虽然怪异,但也是保证正确的。

 
可以用动态内存来为数组分配空间:
#include <malloc.h>
#include <stdio.h>

void f(int k, int m)
{
int i, size = m >= k ? m : k;
int* a = (int*)malloc(sizeof(int)*size);

if( a == NULL )
printf( "Insufficient memory available\n" );
else
for(i = 1; i <= size; ++i)
{
a[i] = i;
printf("%d ",a[i]);
}

free(a); /*记住要释放掉分配的内存,否则内存泄露*/
}


int main()
{
f(3,5);
}
但我试了一个这样的程序。只能编译,却不能执行
#include <malloc.h>
#include <stdio.h>

void f(int k, int m)
{
int i, size = m >= k ? m : k;
int* a = (int*)malloc(sizeof(int)*size);

if( a == NULL )
printf( "Insufficient memory available\n" );
else
printf("Please enter %i int numbers!\n",size);
for(i=1;i<=size;++i)//或者从0开始我都试过啦
{
    scanf("%i",a[i]);
}
for(i = 1; i <=size; ++i)

 printf("%d   ",a[i]);
}

free(a); /*记住要释放掉分配的内存,否则内存泄露*/
}


int main(void)
{
f(3,5);
return 0;
}


只有注册用户登录后才能发表评论。


网站导航: