有没有办法(malloc
除外)创建一个用户输入大小的数组?
答案 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
一个新的内存块并复制内容。