realloc() 第一次调用后不分配

realloc() not allocating after first call

我一直收到分段错误(我知道这意味着什么,我只是不明白为什么我一直收到它们)。

int main(void)
{
  srand(time(NULL));

  int cardsSize = 0; //tracks the amount of memory space my pointer is pointing too.
  int *cards = NULL; 

  if(drawCard(&cards, ++cardsSize) == -1)
  {
      printf("Memory allocation failed.\n");
      return 0;
  }

  if(drawCard(&cards, ++cardsSize) == -1)
  {
      printf("Memory allocation failed.\n");
      return 0;
  }
//... more code
}

调用 realloc() 的部分:

int drawCard(int **cardsptr, int cardsSize)
{
  int newCard = rand() % 13;

  printf("Address before:\t%p\ncardsSize:\t%d\n", *cardsptr, cardsSize); //an attempt at debugging by examining if the null pointer actually gets an address.

  *cardsptr = realloc(*cardsptr, cardsSize * sizeof(int));

  printf("Address after:\t%p\n", *cardsptr); 

  if(*cardsptr == NULL)
    return -1;

  if (newCard > 10)
    **(cardsptr + cardsSize - 1) = 10;
  else
    **(cardsptr + cardsSize - 1) = newCard;

  printf("Reached.\n"); //to see if I crash before or after trying to assign a value.
  return 0;
}

第一次调用drawCard()一切正常。第二次刚要给新分配的内存赋值就报segmentation fault错误

调试消息的输出是:

Address before: (nil)
cardsSize:  1
Address after:  0x2428010
Reached.

Address before: 0x2428010
cardsSize:  2
Address after:  0x2428010
Segmentation fault (core dumped)

据我所知它应该有效。 我将一个指向 NULL 的指针传递给 drawCard() 函数,并在调用 realloc() 时取消引用它。这使得 realloc() 的行为类似于 malloc(),这也确保该指针将来可以传递给 realloc(),因为 realloc() 需要一个指向由 [分配的内存的指针=19=]。 我通过 cardsSize 跟踪大小,并将其与 sizeof 结合使用以重新分配正确的内存量。我通过检查它是否返回 NULL 指针来检查 realloc() 是否成功。 然后我取消引用它两次,这样我就可以在我的初始指针现在指向的内存点之一中放置一个值。

**(cardsptr + cardsSize - 1)应该改成*(*cardsptr + cardSize - 1),或者更直观地说,(*cardsptr)[cardSize-1].

问题是**(cardsptr + cardsSize - 1)

您将 cardsSize - 1 添加到指向 cards 变量的指针。 cardsptr 指向堆栈中的内容。因此,向其添加 cardsSize - 1 会将您移至堆栈中您显然无法取消引用的内容 - 并且不打算取消引用。

所以要么使用 *(*cardsptr + cardsSize - 1) 要么不那么晦涩难懂 (*cardsptr)[cardsSize - 1]