Указатель программы C, являющийся realloc'd, не был выделен - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался создать два подмассива одного массива по некоторым условиям и использовать realloc для увеличения пространства указателя.Однако этот код: показал, что указатель, являющийся realloc'd, не был выделен.Всего 5 предметов, и это не удалось на 4 предметах.Я действительно запутался, почему это может быть успешным для первых 3 пунктов.

void sortHand(Hand *hand, Suit trump) {
  int length = NUM_CARDS_IN_HAND - 1;
  Card *cards = getAllCardsFromHand(hand, length);
  Card *trumpCards = (Card*)malloc(sizeof(Card));
  Card *otherCards = (Card*)malloc(sizeof(Card));
  int trumpCount = 1, otherCount = 1;
  for (int i = 0; i <= length ; i++) {
    Card curtCard = cards[i];
    if (curtCard.suit == trump){
      trumpCount = addCardsBySuit(trumpCards, curtCard, trumpCount);
      printf("trumpCount %d\n", trumpCount);
      continue;
    }
      otherCount = addCardsBySuit(otherCards, curtCard, otherCount);
      printf("otherCount%d\n", otherCount);
  }
  if (trumpCards == NULL) {
    printf("Trump is zero. Other is %d.", (otherCount + 1));
    addAllCardsTohand(otherCards, hand, otherCount);
    return;
  }
  if (otherCards == NULL){
    printf("Other is zero. Trump is %d.", (trumpCount + 1));
    addAllCardsTohand(trumpCards, hand, trumpCount);
    return;
  }
  printf("Trump is %d. Other is %d.", (trumpCount + 1), (otherCount + 1));
  addAllCardsTohand(trumpCards, hand, trumpCount);
  addAllCardsTohand(otherCards, hand, otherCount);
}

Я думаю, проблема в этой функции.

int addCardsBySuit(Card *trumpCards, Card card, int trumpCount) {
  printf("addCardsBySuit\n");
  Card *moreCards = (Card*)realloc(trumpCards, trumpCount * sizeof(Card));
  trumpCards = moreCards;
  trumpCards[trumpCount] = card;
  trumpCount++;
  return trumpCount;
}

Это мой тестовый код и вывод.

void test_sort_hand() {
  start_test("sort_hand");
  Hand *hand = createHand();
  Card card1 = {NINE, HEARTS, -1};
  addCardToHand(&card1, hand);
  Card card2 = {JACK, HEARTS, -1};
  addCardToHand(&card2, hand);
  Card card3 = {ACE, HEARTS, -1};
  addCardToHand(&card3, hand);;
  Card card4 = {QUEEN, HEARTS, -1};
  addCardToHand(&card4, hand);;
  Card card5 = {TEN, SPADES, -1};
  addCardToHand(&card5, hand);
  printHand(hand);
  sortHand(hand, HEARTS);
  printHand(hand);
  end_test();
}

0: Ten_Spades
1: Queen_Hearts
2: Ace_Hearts
3: Jack_Hearts
4: Nine_Hearts
addCardsBySuit
otherCount2
addCardsBySuit
trumpCount 2
addCardsBySuit
trumpCount 3
addCardsBySuit
test(5155,0x11820d5c0) malloc: *** error for object 0x7fd811402b50: pointer being realloc'd was not allocated
test(5155,0x11820d5c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6

1 Ответ

0 голосов
/ 15 февраля 2019

В

int addCardsBySuit(Card *trumpCards, Card card, int trumpCount) {
  printf("addCardsBySuit\n");
  Card *moreCards = (Card*)realloc(trumpCards, trumpCount * sizeof(Card));
  trumpCards = moreCards;
  trumpCards[trumpCount] = card;
  trumpCount++;
  return trumpCount;
}

из addCardsBySuit значение trumpCards не изменяется, поэтому в следующий раз вы будете вызывать addCardsBySuit ивы пытаетесь realloc это снова вы будете делать со старым значением, недействительным больше, чем предыдущий результат realloc

Вы можете изменить с помощью

int addCardsBySuit(Card **trumpCards, Card card, int trumpCount) {
  printf("addCardsBySuit\n");
  Card *moreCards = (Card*)realloc(*trumpCards, trumpCount * sizeof(Card));
  *trumpCards = moreCards;
  (*trumpCards)[trumpCount] = card;
  trumpCount++;
  return trumpCount;
}

Конечно, изменив вызов, дайте адрес, на котором находится указатель:

void sortHand(Hand *hand, Suit trump) {
  int length = NUM_CARDS_IN_HAND - 1;
  Card *cards = getAllCardsFromHand(hand, length);
  Card *trumpCards = (Card*)malloc(sizeof(Card));
  Card *otherCards = (Card*)malloc(sizeof(Card));
  int trumpCount = 1, otherCount = 1;
  for (int i = 0; i <= length ; i++) {
    Card curtCard = cards[i];
    if (curtCard.suit == trump){
      trumpCount = addCardsBySuit(&trumpCards, curtCard, trumpCount);
      printf("trumpCount %d\n", trumpCount);
      continue;
    }
      otherCount = addCardsBySuit(&otherCards, curtCard, otherCount);
      printf("otherCount%d\n", otherCount);
  }
...
...