Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中定义函数内部的数组?_C_Arrays - Fatal编程技术网

如何在C中定义函数内部的数组?

如何在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

因此,在我的源文件中,我有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,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