0

我有以下代码

#include <stdio.h>
#include <string.h>

int main()
{
  char a[10000] = "aaaaaaaa"; // this attribute may vary, so the length isn't going to be constant
  int aLength = strlen(a);
  int someParameter = aLength /4; // some attribute that's computed dynamically 

  char table[aLength][someParameter];
}

在表声明中我得到错误 - >“表达式必须有一个常量值”。我怎样才能克服这个?

4

4 回答 4

7

在较早的 C 版本(例如 C89)中,您不能声明具有可变长度的数组。非常量数组大小使事情变得复杂并且总体上不是很有用,因为变量可能非常大并立即溢出堆栈。

尽管如此,它还是以可变长度数组的名称添加到 C(在 C99 中)。因此,过去你只能这样做:

int array[CONSTANT_EXPRESSION];

但使用 C99 或更高版本,您可以:

some_variable = whatever_expression();
int array[some_variable];

当然,您应该注意可变长度数组的大小为正数且不要太大。

因此,您有两种解决方案。一是使用C99。即,告诉您的编译器启用 C99 功能。我当然推荐您的第二个解决方案是使用malloc.

于 2013-09-18T09:01:48.830 回答
2

创建table为您将设置大小的矩阵malloc

#include <stdio.h>
#include <string.h>

int main()
{
  char a[10000] = "aaaaaaaa"; // this attribute may vary, so the length isn't going to be constant
  int aLength = strlen(a);
  int someParameter = aLength /4; // some attribute that's computed dynamically 
  char **table;

  // Allocate aLength arrays of someParameter chars
  table  = malloc(aLength * sizeof(*table));
  for(i = 0; i < aLength; i++)
     table[i] = malloc(someParameter * sizeof(*table[i]));
}

一般来说,要拥有可变大小的数组,您可以使用malloc

// For example, allocate n chars
char *str  = malloc(length * sizeof(*str));
于 2013-09-18T08:55:52.430 回答
2

在 C89 中不存在可变长度数组。您需要提供编译时可用的长度。

在 C99 中引入了可变长度数组,因此您可以在运行时计算值并使用它们来定义数组的维度。

-std=c99使用带有 gcc 和 vla 标志的C99 。或者使用类似下面的东西。

char get_array (int d1, int d2)
{
  char **arr;
  int i;

  arr = malloc (sizeof (char *) * d1);
  for (i=0; i<d1; i++)
  {
    arr[i] = malloc (sizeof (char) * d2);
  }

  return arr;
}

并释放

void free_arr (char **arr, int d1, int d2)
{
  int i;

  if (arr == NULL)
  { return; } /* caller's responsibility to assign NULL to
               * uninitialized arrays
               */

  for (i=0; i<d1; i++)
  {
    free (arr[i]);
  }
  free (arr);

  return;
}
于 2013-09-18T10:10:25.227 回答
0

您需要方括号内的常量表达式。这将是有效的:

char a[] = "aaaa";
char table[sizeof(a)-1][(sizeof(a)-1)/4];

如果 someParameter 是真正动态的(无法在编译时评估),则必须使用malloc.

于 2013-09-18T09:11:21.927 回答