Операция по адресу указателя: C - PullRequest
1 голос
/ 11 марта 2019

Я новичок в C, выполняя домашнее задание, я застрял во время какой-то проблемы с указателем.
Приведенный ниже код я пытаюсь создать список, unsorted_deck - это строка с пробелами, размер которойиз 52.

char **order_deck(char *unsorted_deck, int size) {
    char *ptr;

    char *decks; //the list of String
    char **ptr_d = &decks;

    ptr = strtok(unsorted_deck, " ");

    printf("%i\n", size);

    for(int i = 0; i < size; i++) {
        *(ptr_d + i) = ptr;
        ptr = strtok(NULL, " ");
        printf("%i:==========%s========%li====\n",i, ptr, (long)(ptr_d+i));
    }

    return ptr_d;
}

По какой-то причине без моего ведома мой код вообще не работает.
Он прерывает цикл for и устанавливает индекс i в тысячу, а иногда даже больше!

Каковы результаты моей программы:

1552:==========(null)========140735261699888====
1553:==========(null)========140735261699896====
1554:==========(null)========140735261699904====
1555:==========(null)========140735261699912====
1556:==========(null)========140735261699920====
1557:==========(null)========140735261699928====
1558:==========(null)========140735261699936====
1559:==========(null)========140735261699944====
1560:==========(null)========140735261699952====
1561:==========(null)========140735261699960====
1562:==========(null)========140735261699968====
1563:==========(null)========140735261699976====
1564:==========(null)========140735261699984====
1565:==========(null)========140735261699992====
1566:==========(null)========140735261700000====
1567:==========(null)========140735261700008====
1568:==========(null)========140735261700016====
1569:==========(null)========140735261700024====
1570:==========(null)========140735261700032====
1571:==========(null)========140735261700040====
1572:==========(null)========140735261700048====
1573:==========(null)========140735261700056====
1574:==========(null)========140735261700064====
1575:==========(null)========140735261700072====
1576:==========(null)========140735261700080====
1577:==========(null)========140735261700088====
Segmentation fault (core dumped)

Может кто-нибудь помочь мне узнать, что случилось?Заранее спасибо.

1 Ответ

1 голос
/ 11 марта 2019

У вас наверняка есть 1 ошибка и 2 потенциальных ошибки

Но это абсолютно не работает, хотя оно даже нарушает цикл for и заставляет меня достигать еще тысячи! ... (ядро сброшено)

как сказано в замечании, вы не инициализируете колоды , это первая ошибка

и:

  • вы не останавливаете strtok , когда он возвращает NULL, но в зависимости от значения size вы уверены, что size определяет число слова в unsorted_deck?

  • вы не копируете ( strdup ) результат strok , поэтому вы сохраняете указатели, указывающие на unsorted_deck, которые предполагают, что unsorted_deck никогда не изменяется, и его жизнь достаточно длинна


Если размер значения точно количество слов в unsorted_deck

char **order_deck(char *unsorted_deck, int size) {
    char *ptr;
    char ** decks = malloc(size * sizeof(char *));

    if (desk == NULL)
      /* not enough memory */
      return NULL;

    ptr = strtok(unsorted_deck, " ");

    printf("%i\n", size);

    for(int i = 0; i < size; i++) {
      decks[i] = ptr; /* or  decks[i] = strdup(ptr); */
      printf("%i:%s\n",i, decks[i]);
      ptr = strtok(NULL, " ");
    }

    return decks;
}

Если вы не знаете, сколько слов в unsorted_deck , realloc можно использовать для расширения результирующего массива.

вам также нужен способ указать, сколько слов вы сохранили в результате. Первая возможность состоит в том, чтобы изменить роль size на выходную переменную, которая будет установлена ​​числом слов.

char **order_deck(char *unsorted_deck, int * size) {
    char *ptr;
    char ** decks = NULL;

    *size = 0;

    ptr = strtok(unsorted_deck, " ");

    while (ptr != NULL) {
      *size += 1;
      decks = realloc(decks, (*size) * sizeof(char *));
      if (deck == NULL) {
        /* not enough memory*/
        return NULL; /* because *size is not null the caller knows the problem */
      }

      decks[*size - 1] = ptr; /* or  decks[*size - 1] = strdup(ptr); */
      printf("%i:%s\n",*size - 1, decks[*size - 1]);
      ptr = strtok(NULL, " ");
    }

    return decks;
}

Другая возможность - завершить результат указателем NULL.

char **order_deck(char *unsorted_deck) {
    char *ptr;
    char ** decks = NULL;
    int size = 0;

    ptr = strtok(unsorted_deck, " ");

    while (ptr != NULL) {
      size += 1;
      decks = realloc(decks, size * sizeof(char *));
      if (deck == NULL) {
        /* not enough memory*/
        return NULL;
      }

      decks[size - 1] = ptr; /* or  decks[size - 1] = strdup(ptr); */
      printf("%i:%s\n",size - 1, decks[size - 1]);
      ptr = strtok(NULL, " ");
    }

    /* add NULL ptr */
    decks = realloc(decks, (size + 1) * sizeof(char *));
    if (desk != NULL)
      decks[size] = NULL

    return decks;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...