有没有办法在c中创建一个可变长度的数组?

时间:2012-09-11 18:11:16

标签: c arrays function

有没有办法(malloc除外)创建一个用户输入大小的数组?

5 个答案:

答案 0 :(得分:6)

这完全取决于编译器。

  

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

答案 1 :(得分: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);
}

答案 2 :(得分:1)

如果您没有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);
}

我不特别推荐这种技术,但它会为你提供不同大小的内存块,而不是堆。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我认为您试图避免malloc,因为您不了解realloc

基本上,你应该尝试粗略地做C ++向量的工作。一旦你的数组增长到一定的大小,realloc就会增加到它的两倍。

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