声明数组两次(C99)

问题描述:

我是一个noob,所以我会做这个简短。以下是合法的(C99)?我不想一次存储超过一个数组。我可以创建一个最大需要长度的数组,并且只使用它的一部分,但我宁愿这样做。声明数组两次(C99)

int main(){ 
    double drm[15000]; 
    //do some stuff 
    double drm[14000]; 
    //do some other stuff 
} 

不,你不能那样做。他们需要在不同的区块。你可以这样做:

int main(void) 
{ 
    { 
    double drm[15000]; 
    // do some stuff 
    } 
    { 
    double drm[14000]; 
    // do some other stuff 
    } 
} 

但是,为什么不只是调用一个函数呢?即使你把它们放在不同的块中,你实际上也不能确定编译器在存储方面做什么。

+0

谢谢!我没有把它放在我最小的例子中,但它实际上在for(blah = 0; blah user1313527 2012-04-04 19:26:00

+0

是的 - 一个新的块在任何有'{'的地方开始,并在匹配的'}出现的地方结束。 – 2012-04-04 20:43:44

由于数组与C中的指针强相关,因此您也可以使用动态数组。首先,分配一个新的具有15000个元素的双数组。当你不再需要它时,删除它。然后创建一个包含14 000个元素的新数组。

不要忘记在使用阵列后释放你的堆。人们往往会忘记这一点。此外,你应该检查分配是否成功。

int main(void) 
{ 
    double *drm = 0; 
    drm = (double*)malloc(15000 * sizeof(double)); 
    // do something 
    free(drm); 
    drm = (double*)malloc(14000 * sizeof(double)); 
    // do some other stuff 
    free(drm); // don't forget me 
} 

但是,我会同意卡尔诺鲁姆:使用函数来代替。

+0

文章被标记为“C99”,而不是“C++”。请更新您的示例以使用'malloc()'和'free()'。 – tomlogic 2012-04-04 18:28:39

+0

何时将'new'添加到C99? – KevinDTimm 2012-04-04 18:29:07

+0

哦,对不起,我可能混合了这两种语言。我稍后会解决这个问题。 – 2012-04-04 18:30:43

你可以使用mallocfree(或realloc如果你不介意保持数据):

#include <stdlib.h> 
int main(void) 
{ 
     double *drm = (double *)malloc(sizeof(double)*15000); 
     //do stuff 
     free(drm); 
     drm = (double *)malloc(sizeof(double)*14000); 
     //do other stuff 
     free(drm); 
} 
+1

不要施放malloc()的结果 – KevinDTimm 2012-04-04 18:53:36

+0

@KevinDTimm为什么不呢?它没有什么问题。 – 2012-04-04 18:56:14

+1

@JacobAbrahams:没有什么正确的。类型'void *'的表达式可以隐式转换为任何指针类型(除了指向函数的类型)。演员阵容很混乱,根据具体情况可以掩盖错误。例如,在C90中,如果您忘记'#include '(* not *'';这是非标准的),编译器将假定'malloc'返回'int';将结果转换为'double *'可能会导致生成不正确的代码。 – 2012-04-04 19:06:49