【问题标题】:Is there a way create an array with a variable length in c?有没有办法在c中创建一个可变长度的数组?
【发布时间】:2012-09-11 18:11:16
【问题描述】:

是否有任何方法(malloc 除外)来创建具有用户输入大小的数组?

【问题讨论】:

  • 您需要一个支持它的编译器并启用正确的选项。但在做之前要注意 VLA 的缺点。
  • 你为什么不想使用malloc()
  • 我想知道是否有任何替代方法。
  • 看你指的是哪个C。
  • 好吧,你最好对你的输入非常小心,并理解(正如@Mystical 指出的那样)后果。 IMO 可变大小的数组只是一个坏主意。

标签: c arrays function


【解决方案1】:

这完全取决于编译器。

ISO C99 中允许使用可变长度自动数组,并作为 扩展 GCC 在 C90 模式和 C++ 中接受它们。这些数组 像任何其他自动数组一样声明,但长度为 不是常量表达式。存储在点分配 退出大括号级别时声明和释放。为了 示例:

 FILE *
 concat_fopen (char *s1, char *s2, char *mode)
 {
   char str[strlen (s1) + strlen (s2) + 1];
   strcpy (str, s1);
   strcat (str, s2);
   return fopen (str, mode);
 }

更多信息请参见this

【讨论】:

    【解决方案2】:

    一种方法是使用 VLA(C99 定义了所谓的“可变长度数组”)。

    这是一个例子:

    #include <stdio.h>
    
    int use_a_vla (int n)
    {
      int vla[n]; /* Array length is derived from function argument.  */
    
      vla[0] = 10;
      vla[n-1] = 10;
    
      return 0;
    }
    
    int main (void)
    {
      int i;
    
      scanf ("%d", &i); /* User input.  */
    
      use_a_vla (i);
    }
    

    【讨论】:

      【解决方案3】:

      如果您没有 VLA 或 alloca(),这里有一个非常笨拙但可移植的基于堆栈的技术:

      int foo(int size)
      {
          if (size <= 64*1024)
          {
              unsigned char   arr[64*1024];
              return bar(arr, size);
          }
          else if (size <= 1*1024*1024)
          {
              unsigned char   arr[1*1024*1024];
              return bar(arr, size);
          }
          else if (size <= 64*1024*1024)
          {
              unsigned char   arr[64*1024*1024];
              return bar(arr, size);
          }
          else
              return -1;       // Assume it's too big
      }
      
      int bar(unsigned char arr[], int size)
      {
          ...your code goes here...
      }
      
      int maincode(int size)
      {
          // Invoke bar() indirectly, allocating an array
          // on the stack of at least 'size' bytes
          return foo(size);
      }
      

      我不特别推荐这种技术,但它会给您分配在堆栈而不是堆上的不同大小的内存块。

      【讨论】:

        【解决方案4】:

        嗯,这是迂腐的,但您可以编写自己的堆管理代码并调用除 malloc() 之外的内存分配函数。我希望这个答案很有趣而不是烦人。

        【讨论】:

          【解决方案5】:

          我假设你试图避免 malloc,因为你不知道 realloc

          基本上,您应该尝试大致完成 C++ 向量所做的事情。一旦你的数组增长到一定大小,realloc 就会增长到原来的两倍。

          realloc 会尽可能增加你的内存块,如果不可能,它会malloc 一个新的并复制内容。

          【讨论】:

            猜你喜欢
            • 2011-04-23
            • 1970-01-01
            • 2017-06-02
            • 2017-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-27
            相关资源
            最近更新 更多