【问题标题】:realloc() not allocating after first callrealloc() 在第一次调用后没有分配
【发布时间】:2016-07-12 08:41:21
【问题描述】:

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

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

【问题讨论】:

  • **(cardsptr + cardsSize - 1) =。为了使人保持良好和冗长的理智状态,请使用方括号。你有数组吗?像数组一样使用它。
  • 如果realloc 失败,则原块不变。但是,您会用realloc 的结果覆盖指针,从而丢失原始块。这是内存泄漏。您也不会释放您分配的块。这里的风格不好,但在许多其他程序中都有问题。养成用小代码做正确的习惯,这样你就会在关键的地方正确完成。
  • @Olaf 使用临时指针在现在需要的地方接收 realloc() 和 free()。谢谢。

标签: c pointers segmentation-fault realloc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-02
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多