使用C调整数组大小
我需要在我正在制作的游戏中拥有一系列结构 – 但我不想将数组限制为固定大小。 我被告知有一种方法可以在需要时使用realloc使数组更大,但找不到任何有用的例子。
有人可以告诉我该怎么做吗?
首先创建数组:
structName ** sarray = (structName **) malloc(0 * sizeof(structName *));
始终分别跟踪大小:
size_t sarray_len = 0;
增加或截断:
sarray = (structName **) realloc(sarray, (sarray_len + offset) * sizeof(structName *));
然后设置大小:
sarray_len += offset;
乐于助人,希望有所帮助。
realloc
函数可用于增大或缩小数组。 当数组增长时,现有条目保留其值,并且新条目未初始化。 这可能就地增长,或者如果不可能,它可以在内存中的其他地方分配一个新块(在幕后,将所有值复制到新块并释放旧块)。
最基本的forms是:
// array initially empty T *ptr = NULL; // change the size of the array ptr = realloc( ptr, new_element_count * sizeof *ptr ); if ( ptr == NULL ) { exit(EXIT_FAILURE); }
乘法是因为realloc
需要多个字节,但您总是希望您的数组具有正确数量的元素。 请注意, realloc
这种模式意味着除了ptr
的原始声明之外,您不必在代码中的任何位置重复T
如果您希望程序能够从分配失败中恢复而不是exit
那么您需要保留旧指针而不是用NULL覆盖它:
T *new = realloc( ptr, new_element_count * sizeof *ptr ); if ( new == NULL ) { // do some error handling; it is still safe to keep using // ptr with the old element count } else { ptr = new; }
请注意,通过realloc
缩小数组可能实际上不会将内存返回给操作系统; 内存可能继续由您的进程拥有,并可用于将来调用malloc
或realloc
。
来自http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
/* realloc example: rememb-o-matic */ #include #include int main () { int input,n; int count=0; int * numbers = NULL; do { printf ("Enter an integer value (0 to end): "); scanf ("%d", &input); count++; numbers = (int*) realloc (numbers, count * sizeof(int)); if (numbers==NULL) { puts ("Error (re)allocating memory"); exit (1); } numbers[count-1]=input; } while (input!=0); printf ("Numbers entered: "); for (n=0;n