我有以下代码
#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; “表达式必须具有恒定值”。我怎么能克服这个?
答案 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
为表动态分配内存。