如何在C中定义函数内部的数组?
因此,在我的源文件中,我有folowin函数:如何在C中定义函数内部的数组?,c,arrays,C,Arrays,因此,在我的源文件中,我有folowin函数: void update(state* old_state, state* measurement, uint32_t size) { state new_state[size]; //some function using measurement and old_state and returning the result in newstate arm_fadd_32(measurement,old_state,newstate,s
void update(state* old_state, state* measurement, uint32_t size)
{
state new_state[size];
//some function using measurement and old_state and returning the result in newstate
arm_fadd_32(measurement,old_state,newstate,size);
//代码的其余部分
}
现在编译器抛出一个错误,表示
错误#28:表达式必须具有常量值。
我认为这是由于这样一个事实,即即使在方法内部,size局部变量没有改变,编译器在定义size时也希望得到一个常量。
我尝试了以下方法:
int const a = size;
然后尝试重新初始化它,表示常量值未知。
我在互联网上做了一些研究,似乎没有更简单的方法不使用malloc,这是我不想做的,因为我正在使用一些嵌入式应用程序的代码
有没有一种方法可以在不使用malloc的情况下避免这个问题?提前谢谢各位 不,不是真的。如果编译器不允许可变长度数组,则意味着它需要一个编译时常量 C99支持VLA,这可能不是您正在使用的
int const a
声明了一个常量变量(哈哈!),但它绝不是编译时常量。您需要使用malloc
不,不是真的。如果编译器不允许可变长度数组,则意味着它需要一个编译时常量
C99支持VLA,这可能不是您正在使用的
int const a
声明了一个常量变量(哈哈!),但它绝不是编译时常量。您需要在C89中使用malloc
,数组大小必须是常量。const
限定符不限定对象为常量,而是限定对象为只读
在C99中,可以使用非常量数组大小,这些数组称为可变长度数组(VLA)。在C89中,数组大小必须是常量。
const
限定符不限定对象为常量,而是限定对象为只读
在C99中,可以使用非常量数组大小,这些数组称为可变长度数组(VLA)。自1990年ISO C标准起,数组大小必须是常量整数表达式。注意“常量”,而不是常量。常量表达式是(大致上)其值在编译时已知的表达式
const
,虽然它来自同一个词根,但实际上只是表示“只读”
1999年的标准增加了VLA(可变长度数组),这将使您的代码合法。VLAs的一个缺点是没有检测分配所需空间失败的机制;如果分配失败,则程序行为未定义。(如果幸运的话,它可能会崩溃。)
现在大多数C编译器都支持大部分C99标准;您可能需要一个命令行选项来启用它。另一方面,微软的C编译器只支持C90,加上一些C99特有的特性,微软表示他们没有计划改变这一点。如果您让我们知道您使用的编译器,我们可能会更有帮助
您可以使用malloc()
在堆上分配一个动态大小的数组:
state *new_state = malloc(size * sizeof *new_state);
if (new_state == NULL) {
// allocation failed, handle the error somehow
}
请注意,
malloc()
返回一个空指针以指示分配失败,这是一个优于VLAs的优点,即使您的编译器支持VLAs。从1990年的ISO C标准开始,数组的大小必须是一个常量整数表达式。注意“常量”,而不是常量。常量表达式是(大致上)其值在编译时已知的表达式const
,虽然它来自同一个词根,但实际上只是表示“只读”
1999年的标准增加了VLA(可变长度数组),这将使您的代码合法。VLAs的一个缺点是没有检测分配所需空间失败的机制;如果分配失败,则程序行为未定义。(如果幸运的话,它可能会崩溃。)
现在大多数C编译器都支持大部分C99标准;您可能需要一个命令行选项来启用它。另一方面,微软的C编译器只支持C90,加上一些C99特有的特性,微软表示他们没有计划改变这一点。如果您让我们知道您使用的编译器,我们可能会更有帮助
您可以使用malloc()
在堆上分配一个动态大小的数组:
state *new_state = malloc(size * sizeof *new_state);
if (new_state == NULL) {
// allocation failed, handle the error somehow
}
请注意,
malloc()
返回一个空指针以指示分配失败,这是一个优于VLA的优点,即使您的编译器支持它们。您的C编译器显然不支持C99 VLA。这意味着数组必须在编译时具有已知的维度。而你的却不是
显然,您可以使用malloc
在堆上进行分配。但您已经声明,出于性能原因,您不想这样做。如果您确实必须拥有堆栈分配的内存,其大小在运行时确定,那么您需要使用alloca
小心,alloca充满危险。堆栈溢出是使用alloca时经常出现的危险,就像使用C99 VLA时一样。您的C编译器显然不支持C99 VLA。这意味着数组必须在编译时具有已知的维度。而你的却不是 显然,您可以使用
malloc
在堆上进行分配。但您已经声明,出于性能原因,您不想这样做。如果您确实必须拥有堆栈分配的内存,其大小在运行时确定,那么您需要使用alloca
小心,alloca充满危险。使用
alloca
时,堆栈溢出是一种经常出现的危险,就像使用C99 VLA时一样。您要么在编译时知道大小(可能在#define
中),要么使用该常量分配数组,要么在编译时不知道该数字,您需要使用malloc
。您可以在编译时知道大小(可能在#define
中),然后使用常量numb