C:动态声明数组大小

时间:2015-03-18 20:02:58

标签: 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; 
    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;
} 

我改为

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

int main(int argc, char *argv[]) 
{   
    //
    // .... omit some lines here
    // read bits from user input at runtime
    // say precision = 200
    //
    int a=10000,b,c=precision *7/2,d,e,f[precision *7/2+1],g; 
    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;
} 

它没有用,我用Google搜索然后改为

int a=10000,b,c=precision *7/2,d,e,g; 
int *f=calloc(precision *7/2+1, sizeof(int));

它仍然不起作用,我的意思是程序没有崩溃,它计算的值不正确。怎么了?谢谢。

4 个答案:

答案 0 :(得分:3)

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

替换

int f[20000];

int *f = (int *) malloc(20000 * sizeof(int) );

答案 1 :(得分:3)

有两种方法可以达到你想要的效果。

  1. 使用动态内存分配。 malloc()/calloc()
  2. 使用variable-length arrayc99
  3. 如上所述,正如 @ user3386109 所指出的,第二个代码段中的问题是使用未启动的变量b。您可能希望在使用其值之前显式初始化局部变量。

答案 2 :(得分:1)

不同之处在于保证全局变量初始化为0(除非初始化为其他值)。但是局部变量是垃圾,除非你初始化它们。所以问题是变量b在第二个片段中以垃圾开头。

在原始代码中:

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

a将以值10000开头,因为您已将其初始化,b将以0开头,因为它是未初始化的全局变量

在更改的代码中:

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

a将以值10000开头,因为您已将其初始化,b将以某个随机值(例如0x5315fe)开头,因为它是未初始化的本地变量。

答案 3 :(得分:-1)

替换int f [2000]

int * f = new int [2000];

然后使用数组f [0] = 1,f [1] = 2等...

当使用delete [] f;

完成释放内存时

数组大小可以由变量

分配

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