C:动态声明数组大小

C:动态声明数组大小,c,C,我在函数中有以下声明 int f[20000] 我希望数字20000是动态的,如何在代码中声明这样的数组 更具体地说,我有以下代码来计算PI #include <stdlib.h> #include <stdio.h> #define BITS 2000 int a=10000,b,c=BITS*7/2,d,e,f[BITS*7/2+1],g; int main() { for(;b-c;) f[b++]=a/5;

我在函数中有以下声明

int f[20000]
我希望数字20000是动态的,如何在代码中声明这样的数组

更具体地说,我有以下代码来计算PI

#include <stdlib.h> 
#include <stdio.h> 

#define BITS 2000
int a=10000,b,c=BITS*7/2,d,e,f[BITS*7/2+1],g; 

int main() 
{   
    for(;b-c;) 
        f[b++]=a/5; 
    for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 
        for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);     
    //getchar();
    return 0;
} 

它仍然不工作,我的意思是程序没有崩溃,它计算的值不正确。发生了什么?谢谢。

通过使用malloc(或calloc)在堆上进行分配,可以获得一个动态大小的数组

替换

int f[20000];


通过使用malloc(或calloc)在堆上进行分配,可以获得一个动态大小的数组

替换

int f[20000];


区别在于全局变量保证初始化为
0
(除非初始化为其他值)。但是局部变量是垃圾,除非你初始化它们。所以问题是变量
b
在第二个代码段中开始时是垃圾

在原始代码中:

int a=10000,b;
int main(void)
{
}
a
将以值
10000
开头,因为您已初始化它;
b
将以
0
开头,因为它是一个未初始化的全局变量

在更改后的代码中:

int main(void)
{
    int a=10000,b;
}

a
将以值
10000
开始,因为您初始化了它,
b
将以某个随机值开始(例如
0x5315fe
),因为它是一个未初始化的局部变量。

区别在于全局变量保证被初始化为
0
(除非初始化为其他值)。但是局部变量是垃圾,除非您初始化它们。所以问题是变量
b
在第二个代码段中开始时是垃圾

在原始代码中:

int a=10000,b;
int main(void)
{
}
a
将以值
10000
开头,因为您已初始化它;
b
将以
0
开头,因为它是一个未初始化的全局变量

在更改后的代码中:

int main(void)
{
    int a=10000,b;
}
a
将以值
10000
开头,因为您已初始化它;
b
将以某个随机值开头(例如
0x5315fe
),因为它是未初始化的局部变量。

替换int f[2000]

int*f=新int[2000]

然后将数组用作f[0]=1,f[1]=2等

完成后,使用delete[]f释放内存

数组大小可以由变量分配

例如。 int x=2000; f=新整数[x];

替换整数f[2000]

int*f=新int[2000]

然后将数组用作f[0]=1,f[1]=2等

完成后,使用delete[]f释放内存

数组大小可以由变量分配

例如。 int x=2000;
f=new int[x];

有两种方法可以实现您想要的

  • 使用动态内存分配
  • 使用(在c99中)

  • 也就是说,正如@user3386109所指出的,第二个代码片段中的问题是使用未初始化的变量
    b
    。您可能希望在使用局部变量的值之前显式初始化它们。

    有两种方法可以实现您想要的

  • 使用动态内存分配
  • 使用(在c99中)

  • 也就是说,正如@user3386109所指出的,您的第二个代码段中的问题是使用未初始化的变量
    b
    。您可能希望在使用局部变量的值之前显式初始化它们。

    请定义
    它仍然不起作用。
    精度值是多少。您在哪里读取用户精度值。堆栈上的20000*sizeof int数组(80000字节)是一个非常糟糕的主意。可能会导致堆栈溢出。建议:int-arraySize=20000;int-pf=malloc(arraysizeof int);(然后检查'pf'不包含NULL)(确保使用:'free(pf)使用数组时,此代码不会干净地编译。原因有两个:未使用参数argc和argv。建议使用“int main(void)”“7/2”正在执行整数除法,因此结果将始终为“3”而不是3.5。请定义
    它仍然不起作用
    精度值是多少。您在哪里读取用户精度值。20000*sizeof int数组(80000字节)在堆栈上执行此操作是一个非常糟糕的主意。可能会导致堆栈溢出。建议:int arraySize=20000;int pf=malloc(arraySizesizeof int);(然后检查'pf'不包含NULL)(请确保使用:'free(pf)使用数组时,此代码不会干净地编译。原因有两个:未使用参数argc和argv。建议使用“int main(void)”“7/2”正在执行整数除法,因此结果将始终是“3”而不是“3.5”。这个问题被标记为
    c
    ,AFAIK,
    new
    不是
    c
    。这个问题被标记为
    c
    ,AFAIK,
    new
    不是
    c
    。你救了我的命,谢谢。问题不是“我的代码出了什么问题”,(其中有很多错误)。问题是“如何动态调整数组大小?”问题本身有两种非常好的动态分配数组的方法,但从OP的角度来看,这两种方法似乎都不起作用。因此问题变成了,“为什么这段代码不起作用?”你救了我的命,谢谢。问题不是“我的代码出了什么问题>”(其中有很多错误)。问题是“如何动态调整数组大小?”问题本身有两种非常好的动态分配数组的方法,但从OP的角度来看,这两种方法似乎都不起作用。因此,问题变成了:“为什么这段代码不起作用?”