[英]Changing the size of 1D and 2D variable length array
在C99及后续版本中,由于包含可变长度数组,以下程序可以工作。
#include <stdio.h>
int main(void)
{
int i, numFibs;
printf ("How many Fibonacci numbers do you want (between 1 and 75)? ");
scanf ("%i", &numFibs);
if (numFibs < 1 || numFibs > 75)
{
printf ("Bad number, sorry!\n");
return 1;
}
unsigned long long int Fibonacci[numFibs];
Fibonacci[0] = 0; // by definition
Fibonacci[1] = 1; // ditto
for ( i = 2; i < numFibs; ++i )
{
Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];
}
for ( i = 0; i < numFibs; ++i )
{
printf ("%llu ", Fibonacci[i]);
printf ("\n");
}
return 0;
}
但是当我尝试实现以下程序时,它可以正常工作直到a <= 9,a> 9的任何值,程序在数组中占用的元素都不超过9个。
为什么?
#include <stdio.h>
int main()
{
int a=0;
int arr[a];
printf("Enter number of rows: ");
scanf("%d", &a);
printf("\nNo of rows to be entered: %d\n", a);
for(int j=0; j<a; j++)
{
printf("Enter array element[%d]: ", j);
scanf("%d", &arr[j]);
}
for(int j=0; j<a; j++)
{
printf("Entered array element [%d]: %d", j, arr[j]);
printf("\n");
}
return 0;
}
下面是一个2D数组的示例,该数组可以正常工作,直到b <= 2的值,然后该程序以分段失败结束。 为什么呢
#include <stdio.h>
int main()
{
int b=0;
int arr[b][2];
printf("Enter number of rows: ");
scanf("%d", &b);
printf("No of rows to be entered: %d", b);
for(int i=0; i<b; i++)
{
for(int j=0; j<2; j++)
{
printf("Enter array element[%d][%d]: ", i, j);
scanf("%d", &arr[i][j]);
}
}
printf("\n");
for(int i=0; i<b; i++)
{
for(int j=0; j<2; j++)
{
printf("Enter array element[%d][%d]: %d", i, j, arr[i][j]);
printf("\n");
}
}
return 0;
}
在上面的示例中,动态获取行和列都是错误的,但是动态获取行是可行的。 如果您动态获取列,那么它也会失败。
没有malloc()还有其他方法可以解决这些问题吗?
在计算机上运行的GCC版本:-
C:\\ Users \\ gahlot> gcc -v使用内置规范。 COLLECT_GCC = gcc COLLECT_LTO_WRAPPER = c:/ mingw / bin /../ libexec / gcc / mingw32 / 6.3.0 / lto-wrapper.exe目标:mingw32配置为:../src/gcc-6.3.0/configure- build = x86_64-pc-linux-gnu --host = mingw32 --target = mingw32 --with-gmp = / mingw --with-mpfr --with-mpc = / mingw --with-isl = / mingw- prefix = / mingw --disable-win32-registry --with-arch = i586 --with-tune = generic --enable-languages = c,c ++,objc,obj-c ++,fortran,ada --with-pkgversion = 'MinGW.org GCC-6.3.0-1'-启用静态-启用共享-启用线程--with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix = / mingw --with-libintl-prefix = / mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nls线程模型:win32 gcc版本6.3。 0(MinGW.org GCC-6.3.0-1)
VLA的大小在遇到声明时确定。
0
,甚至不能为负。 这不会按照您认为的那样做:
int a=0;
int arr[a];
printf("Enter number of rows: ");
scanf("%d", &a);
一旦以给定大小定义了数组,即使该大小不是常量表达式,数组的大小也将固定。 大小是不依赖于当前值a
。 创建大小为0的数组也是无效的。
C标准的6.7.6.2p5节对此进行了详细说明:
如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为由*代替; 否则, 每次对其进行评估时,其值均应大于零。 可变长度数组类型的每个实例的大小在其生存期内均不会更改。
在这种情况下,数组的大小由单个变量指定,但是大小可以由任何表达式确定。 例如:
int f()
{
int a, b, c;
scanf("%d", &a);
b=3;
c=9;
return sqrt(a) * (b - c) + sin(b);
}
...
int arr[f()];
如果您这样定义arr
,即使您可以更改大小,您如何期望发生这种情况?
至于为什么您的第二和第三段代码有时起作用而有时却不起作用,则意味着您正在调用未定义的行为 。 在这两种情况下,这都是由创建一个至少一维为0的数组并随后尝试使用它引起的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.