第一次调用后realloc()没有分配

时间:2016-03-24 16:46:11

标签: c pointers segmentation-fault realloc

我不断出现分段错误(我知道这意味着我只是不明白为什么我会继续得到它们。)

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()一切正常。我想第二次为新分配的内存分配值时,第二次出现分段错误错误。

调试消息的输出是:

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()需要一个指针指向由{分配的内存“ {1}}。 我通过malloc()跟踪大小,并将其与cardsSize结合使用以重新分配适量的内存。我通过检查它是否返回sizeof指针来检查realloc()是否成功。 然后我取消引用它两次,这样我就可以在我的初始指针现在指向的一个内存点中放置一个值。

2 个答案:

答案 0 :(得分:2)

**(cardsptr + cardsSize - 1)应更改为*(*cardsptr + cardSize - 1),或更直观,(*cardsptr)[cardSize-1]

答案 1 :(得分:2)

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

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

因此,请使用*(*cardsptr + cardsSize - 1)或更少隐晦(*cardsptr)[cardsSize - 1]