7

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

4

5 回答 5

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);
 }

有关更多信息,请参阅

于 2012-09-11T18:19:16.067 回答
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);
}
于 2012-09-11T18:18:22.190 回答
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);
}

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

于 2012-09-11T18:33:44.110 回答
0

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

本质上,您应该尝试大致执行 C++ 向量的功能。一旦你的数组增长到一定大小,realloc它的大小就会增加一倍。

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

于 2012-09-11T22:29:52.670 回答
0

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

于 2012-09-11T18:23:12.977 回答