用C调整数组大小

用C调整数组大小,c,arrays,memory,dynamic,C,Arrays,Memory,Dynamic,我需要在我正在制作的游戏中有一个结构数组,但我不想将数组限制在固定大小。我被告知有一种方法可以在需要时使用realloc使数组变大,但找不到任何这样的工作示例 有人能告诉我怎么做吗?来自 /*realloc示例:rememb-o-matic*/ #包括 #包括 int main() { int输入,n; 整数计数=0; int*numbers=NULL; 做{ printf(“输入一个整数值(0到结尾):”; scanf(“%d”,输入(&I)); 计数++; numbers=(int*)rea

我需要在我正在制作的游戏中有一个结构数组,但我不想将数组限制在固定大小。我被告知有一种方法可以在需要时使用realloc使数组变大,但找不到任何这样的工作示例

有人能告诉我怎么做吗?

来自

/*realloc示例:rememb-o-matic*/
#包括
#包括
int main()
{
int输入,n;
整数计数=0;
int*numbers=NULL;
做{
printf(“输入一个整数值(0到结尾):”;
scanf(“%d”,输入(&I));
计数++;
numbers=(int*)realloc(numbers,count*sizeof(int));
如果(数字==NULL)
{puts(“错误(重新)分配内存”);退出(1);}
数字[计数-1]=输入;
}while(输入!=0);
printf(“输入的数字:”);

对于(n=0;n从创建数组开始:

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
函数可用于增大或缩小数组。当数组增大时,现有条目保留其值,而新条目未初始化。这可能会就地增大,或者如果不可能,它可能会在内存中的其他位置分配新块(在幕后,将所有值复制到新块并释放旧块)

最基本的形式是:

// 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
的这种模式意味着您不必在代码中重复
T
,而只需原始声明
ptr

如果希望程序能够从分配失败中恢复,而不是执行
退出
,则需要保留旧指针,而不是用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

请发布您迄今为止编写的代码。人们通常不喜欢只将您的代码写入操作系统r你。例如:C中结构的动态数组:第一次google点击如何?到目前为止你尝试了什么?我很幸运地在google中搜索到了一个更复杂的解决方案,该解决方案用它的长度来包装数组。我给出了参考,这使它成为一个cookie,不是吗?第一行将通过编写
structName**sarray=NULL; 。将
realloc
与空指针一起使用是定义良好的。请注意,
malloc(0)
具有实现定义的结果;它可能返回null或一个永远无法取消引用的有效指针(但可以传递给
free()
realloc()
)。挑剔:这不会管理“结构数组”但是指向结构的指针数组。这不是指针的大小吗?
sizeof(structName*)
不是吗
sizeof(structName)
?为什么我们需要一个双指针?
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;
}