【发布时间】:2012-04-04 18:19:57
【问题描述】:
我是菜鸟,所以我会简短地说。以下是否合法(C99)?我不想一次存储多个数组。我可以创建一个具有最大所需长度的数组并只使用它的一部分,但我宁愿这样做。
int main(){
double drm[15000];
//do some stuff
double drm[14000];
//do some other stuff
}
【问题讨论】:
我是菜鸟,所以我会简短地说。以下是否合法(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
}
}
但是为什么不直接调用一个函数呢?即使您将它们放在不同的块中,您也无法真正保证编译器将针对存储执行什么操作。
【讨论】:
{ 的任何地方开始,并在匹配的 } 出现的地方结束。
您可以使用malloc 和free(或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);
}
【讨论】:
void* 类型的表达式可以隐式转换为任何指针类型(除了指向函数的指针类型)。演员阵容很混乱,根据情况它可以掩盖错误。例如,在 C90 中,如果您忘记了 #include <stdlib.h>(not <malloc.h>;这是非标准的),编译器将假定 malloc 返回 int;将结果转换为 double* 可能会导致生成不正确的代码。
stdlib.h,编译器会假定返回类型为 int 类型,而我们会无意中将其转换为仍然不正确的指针。事实上,这种情况下编译器会产生“无法从 int 转换为 some*”的错误
something到something*的转换!啊,我总是用 CPP 编译器运行 C 程序。我的坏:)
由于数组与 C 中的指针密切相关,因此您也可以使用动态数组。首先,分配一个包含 15 000 个元素的新双精度数组。当您不再需要它时,将其删除。然后创建一个包含 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
}
不过,我同意 Carl Norum 的观点:改用函数。
【讨论】:
C99,而不是C++。请更新您的示例以使用malloc() 和free()。
malloc 电话最好写成drm = malloc(15000 * sizeof *drm);
malloc() 是否成功。)