0

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

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

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

4

4 回答 4

4

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

查看mallocfree并获取此处列出的初学者书籍之一。在没有扎实基础的情况下尝试编写 C 会导致流血、眼泪和段错误。想想孩子们。不要这样做。

让您开始用脚射击自己的示例:

int* intarray = NULL;
intarray = (int*)malloc(sizeof(int) * 23); // allocate space for 23 intS
于 2012-04-04T21:00:35.730 回答
2

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

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);
于 2012-04-04T21:02:55.700 回答
1

如果您希望在堆栈上分配数据(并且如果它可用),我会建议您alloca结束,但 malloc 在大多数情况下都可以工作。malloc

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

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

data_type data[size];

但是,如果您必须动态分配它,您可以简单地将最后一行替换为:

data_type *data = alloca(size * sizeof(*data)); 
于 2012-04-04T21:09:48.943 回答
1

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

从 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 还支持可变长度数组,它允许您在运行时指定数组的大小:

int main(void)
{
  int size;

  // get size as before

  int array[size];
  ...
}

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

于 2012-04-04T21:55:01.447 回答