使用realloc调整动态数组的大小
我试图扩大我的球员名单 当我使用使用realloc调整动态数组的大小,c,arrays,memory-management,malloc,realloc,C,Arrays,Memory Management,Malloc,Realloc,我试图扩大我的球员名单 当我使用realloc函数时,它会保存我的播放器,但最后一个除外。 我的意思是,如果我的阵型中有4名玩家,并且我尝试将我的阵型扩展到7,我会得到一个7号的新阵型,只有3名玩家 这是功能的一部分: void initializeListForTree(Player** players, int listSize) { int formulaSize = bla bla bla..... players = (Player **)realloc(players
reallo
c函数时,它会保存我的播放器,但最后一个除外。
我的意思是,如果我的阵型中有4名玩家,并且我尝试将我的阵型扩展到7,我会得到一个7号的新阵型,只有3名玩家
这是功能的一部分:
void initializeListForTree(Player** players, int listSize)
{
int formulaSize = bla bla bla.....
players = (Player **)realloc(players, sizeof(Player *)*formulaSize);
if (!players)
{
printf("memory allocation failed\n");
}
}
不,您不能从
initializeListForTree()
函数更改players
本身()C
使用传递值传递函数参数。对player
内部initializeListForTree()
函数所做的任何更改都不会反映到实际使用的参数中
如果必须完成此操作,则需要将指针传递给玩家
如果您不介意使用另一种方法,如果选择返回新的
从initializeListForTree()
中分配指针,并将其收集到传递的实际参数中,则无需传递指向指针的指针
也就是说
- 请在
C
中输入malloc()
和family的返回值
- 请不要将
realloc()
的返回值直接存储到目标指针中。如果realloc()
失败,它将覆盖有效条目
否,您不能从initializeListForTree()
函数更改播放器本身()C
使用传递值传递函数参数。对player
内部initializeListForTree()
函数所做的任何更改都不会反映到实际使用的参数中
如果必须完成此操作,则需要将指针传递给玩家
如果您不介意使用另一种方法,如果选择返回新的
从initializeListForTree()
中分配指针,并将其收集到传递的实际参数中,则无需传递指向指针的指针
也就是说
- 请在
C
中输入malloc()
和family的返回值
- 请不要将
realloc()
的返回值直接存储到目标指针中。如果realloc()
失败,它将覆盖有效条目
否,您不能从initializeListForTree()
函数更改播放器本身()C
使用传递值传递函数参数。对player
内部initializeListForTree()
函数所做的任何更改都不会反映到实际使用的参数中
如果必须完成此操作,则需要将指针传递给玩家
如果您不介意使用另一种方法,如果选择返回新的
从initializeListForTree()
中分配指针,并将其收集到传递的实际参数中,则无需传递指向指针的指针
也就是说
- 请在
C
中输入malloc()
和family的返回值
- 请不要将
realloc()
的返回值直接存储到目标指针中。如果realloc()
失败,它将覆盖有效条目
否,您不能从initializeListForTree()
函数更改播放器本身()C
使用传递值传递函数参数。对player
内部initializeListForTree()
函数所做的任何更改都不会反映到实际使用的参数中
如果必须完成此操作,则需要将指针传递给玩家
如果您不介意使用另一种方法,如果选择返回新的
从initializeListForTree()
中分配指针,并将其收集到传递的实际参数中,则无需传递指向指针的指针
也就是说
- 请在
C
中输入malloc()
和family的返回值
- 请不要将
realloc()
的返回值直接存储到目标指针中。如果realloc()
失败,它将覆盖有效条目
更多类似于:
void initializeListForTree(Player*** players, int listSize)
{
int formulaSize = bla bla bla.....
void *p = realloc(*players, sizeof(Player *)*formulaSize);
if (!p) {
printf("memory allocation failed\n");
}
else {
*players = p;
}
}
在呼叫现场
Player **playerslist = NULL;
initializeListForTree(&playerslist, 1);
...
initializeListForTree(&playerslist, 2);
etc..
当然,只有当您的类型是指向指针列表的指针时,才会出现这种情况。更多类似于:
void initializeListForTree(Player*** players, int listSize)
{
int formulaSize = bla bla bla.....
void *p = realloc(*players, sizeof(Player *)*formulaSize);
if (!p) {
printf("memory allocation failed\n");
}
else {
*players = p;
}
}
在呼叫现场
Player **playerslist = NULL;
initializeListForTree(&playerslist, 1);
...
initializeListForTree(&playerslist, 2);
etc..
当然,只有当您的类型是指向指针列表的指针时,才会出现这种情况。更多类似于:
void initializeListForTree(Player*** players, int listSize)
{
int formulaSize = bla bla bla.....
void *p = realloc(*players, sizeof(Player *)*formulaSize);
if (!p) {
printf("memory allocation failed\n");
}
else {
*players = p;
}
}
在呼叫现场
Player **playerslist = NULL;
initializeListForTree(&playerslist, 1);
...
initializeListForTree(&playerslist, 2);
etc..
当然,只有当您的类型是指向指针列表的指针时,才会出现这种情况。更多类似于:
void initializeListForTree(Player*** players, int listSize)
{
int formulaSize = bla bla bla.....
void *p = realloc(*players, sizeof(Player *)*formulaSize);
if (!p) {
printf("memory allocation failed\n");
}
else {
*players = p;
}
}
在呼叫现场
Player **playerslist = NULL;
initializeListForTree(&playerslist, 1);
...
initializeListForTree(&playerslist, 2);
etc..
当然,只有当您的类型是指向指针列表的指针时,才会出现这种情况。其中realloc()
查找扩展内存:
- 如果在原始内存之后有足够的可用空间,那么它将使用它,并且原始地址不会改变
- 如果原始内存位于堆/的末尾,它扩展了内存,所以原始地址不会改变
- 如果原始内存位于heap/,并且没有足够的空间,那么它将分配一个新的内存块,并将您的原始内存复制到新内存中,因此地址会更改
最后一种情况发生的几率很大,因此在调用realloc()
后,您始终需要更新您的地址
旧地址可能会被放入空闲内存列表中,您不应该再触摸它。它可能由另一个malloc()/…分配。。以后再打电话
您可以看到,realloc()
可能很重,因为它可能需要复制内存,所以如果可能,请改进代码以避免使用它
以下是一个可能的用例(来自TLPI):
基本上,首先检查返回值是否成功:
- 如果失败,则原始内存保持不变
- 如果成功,请分配新地址