Безопасно преобразовать символ в строку UNIX C

Как безопасно преобразовать строку в символ.


Я использовал:

void write_binary_op(stack** head, char*** returned_str, int* index, char ch) {
  while(*head && comp_priority((*head)->op[0], ch)) {
    (*returned_str)[(*index)++] = pop(head);
  }
  char* t_p = strdup(&ch); <-------------
  push(head, t_p);
  free(t_p);
}

В чём опасность данного метода и почему не стоит так делать?

Я так понимаю есть второй вариант на строку из 2 символов где 2 символ \0.

char* str = calloc(2, sizeof(char));
str[0] = ch;
push(head, str);

Есть ли иной способ выполнить данную задачу чтобы valgrind не ругался.

stack* init(char* op) {
  stack* temp = (stack*)malloc(sizeof(stack));
  temp->op= strdup(op);
  temp->next = NULL;
  return temp;
}

} else if (ch == '(' && (check = 3)) {
  push(&head, "(");
} else if (strchr(POST_FUN, ch) && check++ == 0) {
  write_binary_op(&head, &rpn_str, &index_str, ch);
} else if (strchr(PREF_FUN, ch) && check && ch == '-') {
      push(&head, "~");
} else if (ch == 'x') {
  if (check > 0) check = 0;
  push(&head, "x");
}

Github

Чтобы сделать что-то хорошо нужно для начала 3 раза сделать это неправельно, только после этого приходит озарение.


Ответы (1 шт):

Автор решения: Harry
char* t_p = strdup(&ch);

Тут strdup будет делать дубль строки, которая в памяти начинается с символа ch, и пока не встретится нулевой символ... А вы точно знаете, где там и что лежит — в памяти, которая вам по сути не принадлежит? Это выход за границы массива из одного элемента :)

Только вот дальнейшее...

push(head, t_p);
free(t_p);

Получается, вы вносите куда-то указатель на эту строку, после чего ее освобождаете. Результат — у вас сохранен указатель по сути в никуда. Эта память может быть тут же занята чем-то иным. Смысла в таком хранении нет никакого.

→ Ссылка