使用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):

      基本上,首先检查返回值是否成功:

      • 如果失败,则原始内存保持不变
      • 如果成功,请分配新地址