Безопасно преобразовать символ в строку 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");
}
Чтобы сделать что-то хорошо нужно для начала 3 раза сделать это неправельно, только после этого приходит озарение.
Ответы (1 шт):
char* t_p = strdup(&ch);
Тут strdup будет делать дубль строки, которая в памяти начинается с символа ch, и пока не встретится нулевой символ... А вы точно знаете, где там и что лежит — в памяти, которая вам по сути не принадлежит? Это выход за границы массива из одного элемента :)
Только вот дальнейшее...
push(head, t_p);
free(t_p);
Получается, вы вносите куда-то указатель на эту строку, после чего ее освобождаете. Результат — у вас сохранен указатель по сути в никуда. Эта память может быть тут же занята чем-то иным. Смысла в таком хранении нет никакого.