Нужны ли мне строки в стиле mallo c C? - PullRequest
0 голосов
/ 04 августа 2020

Я недавно начал использовать Arduino, поэтому мне все еще нужно адаптироваться и найти различия между C / C ++ и языком Arduino.

Итак, у меня к вам вопрос.

Когда я вижу кто-то, использующий строку в стиле C в Arduino (char *str), всегда инициализирует ее так (и никогда не освобождает):

char *str = "Hello World";

В чистом виде C, я бы что-то сделал вот так:

int my_strlen(char const *str)
{
    int i = 0;

    while (str[i]) {
        i++;
    }
    return (i);
}

char *my_strcpy(char *dest, char const *src)
{
    char *it = dest;

    while (*src != 0) {
        *it = *src;
        it++;
        src++;
    }
    return (dest);
}

char *my_strdup(char const *s)
{
    char *result = NULL;
    int length = my_strlen(s);

    result = my_malloc(sizeof(char const) * (length + 1));
    if (result == NULL) {
        return (NULL);
    }
    my_strcpy(result, s);
    return (result);
}

, а затем инициализируйте его следующим образом:

char *str = my_strdup("Hello World");
my_free(str);

Итак, вот мой вопрос, о строках Arduino в стиле C, является mallo c необязательным или эти люди просто ошиблись?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 04 августа 2020

В C ++ лучше использовать new[] / delete[] и не смешивать его с malloc / free.

В Arduino также есть класс String, который скрывает от вас эти выделения .

Однако использование динамического c выделения памяти на такой ограниченной платформе имеет свои подводные камни, такие как фрагментация кучи (в основном из-за того, что String перегружает оператор +, поэтому все злоупотребляют им, например: Serial.println(String{"something : "} + a + b + c + d + ......), а затем задаются вопросом о загадочных сбоях .

Подробнее об этом в блоге Majenko: The Evils of Arduino String class (Majenko имеет самую высокую репутацию на стеке Arduino)

В основном с классом String ваш strdup-код будет просто так:

 String str{"Hello World"};
 String copyOfStr = str;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...