繁体   English   中英

ANSI C 程序:如何在程序运行时确定长度时初始化数值数组?

[英]ANSI C Program: How to initialize numeric array when length is determined when program runs?

C 的新手。我正在编写一个 ANSI C 程序(在 Linux 上使用 gcc 4.4.6)并且需要知道如何初始化一个数值数组,例如 int 或 double,其中数组的长度在程序运行时确定跑步?

ANSI C 是否允许声明变量、执行一些代码(其中长度已确定),然后声明其他变量(例如有问题的 arrays)?

如果没有,这在实践中是如何完成的? 请注意,程序使用gcc -ansi...开关进行编译。

您需要为数组分配 memory 并在完成后释放它。

请参阅malloc免费获得此处列出的初学者书籍之一。 在没有坚实基础的情况下尝试编写 C 以血泪和段错误告终。 想想孩子们。 不要这样做。

让你开始搬起石头砸自己脚的例子:

int* intarray = NULL;
intarray = (int*)malloc(sizeof(int) * 23); // allocate space for 23 intS

要创建动态数组,您需要使用指针; 用法几乎相同,但是完成后需要 free() memory;

int staticArray[10];
int *dynamicArray;

// calculate length of the dynamic array here
int length = 3*4;

dynamicArray = (int*)malloc(length * sizeof(int));

staticArray[4]  = 7;
dynamicArray[8] = 5;

free(dynamicArray);

如果您希望在堆栈上分配数据(如果它可用),我建议alloca超过malloc ,但 malloc 在大多数情况下都可以使用。

请注意,GCC 允许灵活的长度 arrays,即使在使用-ansi编译时也是如此,因此您可以这样做:

int size = 0;
printf("please enter array size: ");
scanf("%i", &size);

data_type data[size];

但是,如果您必须动态分配它,您只需将最后一行替换为:

data_type *data = alloca(size * sizeof(*data)); 

ANSI C 是否允许声明变量、执行一些代码(其中长度已确定),然后声明其他变量(例如有问题的 arrays)?

从 1999 标准开始,您可以在一个块中混合声明和代码; 在此之前,块中的所有声明都必须先于代码。 要针对 C99 进行编译,请使用-std=c99而不是-ansi (与-std=c89同义)。 所以以下内容在 C99 中是合法的:

int main(void)
{
  int size;

  // get the size somehow

  int *array = malloc(sizeof *array * size);
  ...
  // don't forget to clean up when you're done
  free(array);
}

如果必须使用-ansi标志进行编译(意味着必须符合 C89 标准),则必须像这样构建代码:

int main(void)
{
  int size;
  int *array; 

  // get size somehow

  array = malloc(sizeof *array * size);
  ...
  free(array);
}

请注意,C99 还支持可变长度 arrays ,它允许您在运行时指定数组的大小:

int main(void)
{
  int size;

  // get size as before

  int array[size];
  ...
}

与常规 arrays 相比,VLA 有一些限制(它们不能是结构或联合类型的成员,并且它们不能出现在函数之外),必须小心使用; 如果您需要分配大量空间,请改用malloc 它们的实施结果非常复杂,以至于最近批准的 2011 标准为实施提供了支持它们的选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM