strcat и malloc

В настоящее время мне нужно объединить две строки strcat (). Загвоздка в том, что я должен проделать это 3 раза. (Всего 6 конкатенаций). Процедура такая, повторяется 3 раза с использованием петель:

  1. Malloc строка
  2. Используя цикл for, вызовите strcat 2 раза
  3. Освободите строку

Проблема в том, что даже после того, как я освобождаю строку и повторно выполняю malloc, strcat, кажется, продолжает объединять предыдущую строку.

Например:

Ожидаемый результат от AA BB CC DD EE FF

  • strcat строка 1: AABB
  • strcat строка 2: CCDD
  • strcat строка 3: EEFF

Фактический выход:

  • strcat строка 1: AABB
  • strcat строка 2: AABBCCDD
  • strcat строка 3: AABBCCDDEEFF

Кто-нибудь знает, зачем он это делает?

void sendInitialHand(card * deck) {

    char * stringToSend;
    playerNode * curNode;
    curNode = housePlayers.head;

    for (int i=0; i<housePlayers.playerCount; i++) {

        stringToSend = malloc(sizeof(char)*6);

        for (int j=0; j<52; j++) {
            if (deck[j].inPlay == curNode->playerFD) {
                strcat(stringToSend, deck[j].identifier);
            }
        }

        for (int j=0; j<52; j++) {
            if (deck[j].inPlay == 10) {
                strcat(stringToSend, deck[j].identifier);
            }
        }    

        printf("[NETWORK] Send %d the following: %s\n", curNode->playerFD, stringToSend);
        //send(curNode->playerFD, stringToSend, 6, 0);
        free(stringToSend);
        curNode = curNode->next;
    }
}

person user1305850    schedule 03.04.2012    source источник
comment
мы можем увидеть некоторые фрагменты кода?   -  person kevingreen    schedule 03.04.2012
comment
покажите нам реальный код, иначе мы не сможем найти ошибку в коде.   -  person twain249    schedule 03.04.2012


Ответы (2)


После ptr=malloc(…), до strcat() инициализируйте пространство с помощью *ptr = '\0';. Память, возвращаемая malloc(), обычно не обнуляется.

person Luca Rocchi    schedule 03.04.2012

Изучите свою циклическую структуру с помощью операторов printf, вероятно, вы не освобождаете то, что вы думаете, когда вы так думаете. Отредактирую ответ на основе кода ..

Вы только re-malloc, который просто говорит: "Эй, я собираюсь написать здесь ... что вы уже сказали". Попробуйте освободить / повторно инициализировать переменную

person RyanS    schedule 03.04.2012
comment
Этот «ответ», вероятно, должен был быть комментарием. Код прибыл через пару минут после того, как вы разместили это. Поскольку его материал не имеет прямого отношения к проблеме, я предлагаю удалить его (но я бы предпочел не голосовать против, чтобы заставить вас действовать). - person Jonathan Leffler; 19.03.2017