C中的动态数组大小

时间:2013-09-18 08:54:22

标签: c arrays

我有以下代码

#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];
}

在表格声明中我收到错误 - &gt; “表达式必须具有恒定值”。我怎么能克服这个?

4 个答案:

答案 0 :(得分:7)

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

然而,它被添加到C(在C99中)名称​​可变长度数组。因此,过去你只能这样做:

int array[CONSTANT_EXPRESSION];

但是你可以使用C99或更高版本:

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

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

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

答案 1 :(得分: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));

答案 2 :(得分:2)

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

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

使用带有-std=c99标志的C99和gcc和vla。或使用下面的内容。

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;
}

答案 3 :(得分:0)

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

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

如果someParameter是真正动态的(无法在编译时进行评估),则必须使用malloc为表动态分配内存。