C语言 什么时候使用可变长度数组(VLA)?

wpx232ag  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(140)
  • malloc很慢,在堆上分配。适用于大型对象或需要将生存期延长到创建它们的函数之外的对象。
  • 静态分配在堆栈上。分配由编译器烘焙,因此本质上是空闲时间。适合小对象。否则有SO风险。

简而言之,我遵循这些规则来决定如何分配内存块。
我在嵌入式设备上工作,时间和空间限制加剧,每当我看到VLA时,我都会畏缩,因为我不知道底层实现将做什么,以及它是否会做出正确的选择。所以我的经验法则是离他们远点。是否有使用VLA而不是经典的malloc或静态分配的情况,特别是在嵌入空间方面?

jdgnovmf

jdgnovmf1#

我想不出在嵌入式空间中如何很好地使用VLA。我很难想出一个好的应用程序空间使用。
我过去在标记或操作字符串时使用它们作为工作存储:

void tokenize( const char *str )
{
  /**
   * Copy input string to temporary buffer and tokenize
   * that buffer, leaving the original string unmolested
   */
  char tmp[strlen( str )+1];
  strcpy( tmp, str );
  char *tok = strtok( tmp, " " );
  while ( tok )
  {
    // do something interesting with the token
    tok = strtok( NULL, " " );
  }
}

但这不是我经常做的事。

epfja78i

epfja78i2#

自动VLA通常不是很有用,但VM类型有一些用途:

  • 向函数传递数组时的大小检查
#include <stdio.h>

void f(const size_t size, const int buf[static size]);

int main(void)
{
    int arr[50] = { 0 };
    f(10, arr);  // acceptable
    f(50, arr);  // correct
    f(100, arr); // *WARNING*
    return 0;
}
  • 通过一次malloc()调用分配多维数组
// `n` and `m` are variables with dimensions
int (*arr)[n][m] = malloc(sizeof *arr);
if (arr) {
    // (*arr)[i][j] = ...;
    free(arr);
}

相关问题