据我所知,一个阵列需要在C编译时间之前必须有一个特定的大小。
我不知道为什么这个代码仍然有效?
int s;
printf("enter the array size: ");
scanf("%d",&s);
int a[s]; // Isn't s value determined at run time?
据我所知,一个阵列需要在C编译时间之前必须有一个特定的大小。
我不知道为什么这个代码仍然有效?
int s;
printf("enter the array size: ");
scanf("%d",&s);
int a[s]; // Isn't s value determined at run time?
数组大小需要与ANSI 89℃。99版本中删除该限制规范的是已知的并且允许可变尺寸的阵列。
这里是文档没有此功能的GNU版本
如果您需要分配与动态大小的数组,你必须从堆得到它,使用malloc()。
int *a = (int*)malloc(sizeof(int) * s)
您在这里混淆了两两件事。
分:1)确定一个已分配的阵列的大小(这您的标题意味着) sizeof()
由一个的尺寸(比如,第一)元素总量:
sizeof(a)/sizeof(a[0])
2)你的问题问动态分配内存:
int *a = (int*)malloc( s * sizeof(int) );
此代码是由C99语言规范的支持。 该代码还通过在C89 / 90模式作为扩展GCC编译器支持。
所以,回答你的问题(为什么它“作品”)取决于你如何编译它。 在一般情况下,这甚至不会通过C89 / 90的编译器编译。
它重要的是了解内存是如何由编译器分配给变量给予适当的回答你的问题。 存在其中存储器被分配给变量两种工作模式,它可以是在堆或它可以是一个堆栈上。 上堆存储器是动态分配的。 所以被分配在堆内存中的变量可以在运行时被赋予它的大小。
在C的情况下的阵列中给出的叠层上存储器。 对于堆栈上提供存储器的存储器的大小应在编译时是已知的编译器。 这样在运行时那么多的内存可以预留堆栈上的变量来设置。 这是你不能在运行时就C语言而言决定数组的大小的原因。
变长数组一直以来,C语言部分C99 。 但是,他们已经进行了作为一个功能的C11 -意思是C11符合标准的实现不需要提供它(尽管几乎所有支持C99无疑提供沃拉斯在C11上的实现)。
您可以检查是否使用宏您实现不提供VLAS __STDC_NO_VLA__
(如果在编译的C99或C11模式的已定义,那么你的实现不支持沃拉斯)。
所以决定在运行时的阵列的尺寸是可能的现代C(> = C99),并像下面的代码是罚款:
int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
沃拉斯的一个明显缺点是,如果s
是相当大的,并分配a
coud失败。 更糟的是,有没有办法来检查,如果分配已经失败,你会碰到运行时错误(如段错误)。 它本质上是不确定的行为 。 所以, 你想避免沃拉斯如果数组大小是太大 。 基本上,有疑问时,去动态内存分配(见下文)。
另一个问题,更严重的相对于其他,与沃拉斯的是,他们有自动存储时间 (又名“堆栈中分配”)。 所以,如果你想要的东西,持续时间更长,然后在VLA声明块范围 ,然后沃拉斯是没有任何帮助。
在C89 ,没有VLA。 因此,使用动态内存分配是唯一的出路。 虽然,有一些如非标准扩展alloca()
其类似于VLA,并且具有相同的缺点VLAS)。
int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);