有没有办法(除了malloc
)来创建一个用户输入的大小的数组?
问问题
166 次
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 回答