【发布时间】:2019-03-01 12:32:29
【问题描述】:
由于包含可变长度数组,在 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;
}
但是当我尝试实现以下程序时,它可以正常工作,直到 a9 的任何值,该程序在数组中占用的元素不超过 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;
}
下面是一个二维数组的示例,它可以正常工作,直到 b
#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' --enable-static --enable-shared --enable-threads --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 的数组
-
在第一个示例中,我也在更改数组的大小。 numFibs 是用户设置的数组大小。
-
在第三个示例中,动态获取行和列是错误的,但是动态获取行是有效的。如果你动态地取列,它也会失败。
-
No 在第一个示例中,您在知道 numFibs 之后声明了斐波那契。从那时起,它就是那个大小。同样,如果您对其进行了 malloc,它将是您 malloc 的大小,直到您重新分配
-
将您的
int arr...移动到您的第一个scanf下方并查看