Выделение памяти для обугливания* язык C

Действительно ли это - корректный способ выделить память char*.

char* sides ="5";

char* tempSides;

tempSides = (char*)malloc(strlen(inSides) * sizeof(char));
7
задан R Samuel Klatchko 4 June 2010 в 05:47
поделиться

6 ответов

Почти. Строки заканчиваются NULL, поэтому вы, вероятно, захотите выделить дополнительный байт для хранения байта NULL. То есть, хотя длина сторон составляет 1 символ, на самом деле это 2 байта: { 5 , '\ 0' }.

Это будет:

tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char));

, и если вы хотите скопировать его в:

strcpy(tempSides, sides);
16
ответ дан 6 December 2019 в 06:02
поделиться

Обратите внимание, что:

  1. Строки оканчиваются нулем (\ 0), и strlen () не учитывает их;
  2. По определению sizeof (char) равен 1 (байт), поэтому он не требуется;
  3. Если вы используете компилятор C (не C ++), нет необходимости приводить его к char * ;

Итак, это будет:

char *tempSides = malloc(strlen(inSides) + 1);

Тем не менее, если вы хотите дублируйте содержимое inSides , вы можете использовать strdup , например:

char *tempSides = strdup(inSides);
if (tempSides != NULL) {
    // do whatever you want...
    free(tempSides);
}
9
ответ дан 6 December 2019 в 06:02
поделиться

С этим есть проблема. tempSides укажет на неинициализированный блок памяти размером 1. Если вы собираетесь скопировать строку сторон в tempSides, то вам нужно будет выделить размер на один байт длиннее, чтобы удерживать нулевой терминатор для строки. Значение, возвращаемое параметром strlen(), не включает нулевой терминатор в конце строки.

1
ответ дан 6 December 2019 в 06:02
поделиться

Как уже было отмечено, вы не выделили место для завершающего символа NUL. Но я также хотел указать на пару других вещей, которые могут сделать ваш код более лаконичным.

По определению, sizeof(char) всегда равен 1, поэтому вы можете сократить строку выделения до:

tempSides = (char*)malloc(strlen(inSides) + 1);

Еще один момент - похоже, что вы дублируете строку. Есть встроенная функция, которая делает это за вас:

tempSides = strdup(inSides);

Она обрабатывает получение длины, выделение нужного количества байт и копирование данных.

3
ответ дан 6 December 2019 в 06:02
поделиться

Нет, не совсем. Как уже отмечали другие, вам нужно выделить место для терминатора NUL.

Кроме того, обычно следует не отбрасывать возврат из malloc. Это может скрыть ошибку, когда вы забыли #include правильный заголовок. Умножение на sizeof(char) также бессмысленно, поскольку стандарты (как C, так и C++) определяют sizeof(char) всегда равным 1.

Наконец, каждый вызов malloc должен включать проверку результата. Я бы завернул все это в функцию:

char *dupe_string(char const *string) { 
    char *temp;
    if (NULL!=(temp=malloc(strlen(string)+1)))
        strcpy(temp, string);
    return temp;
}
1
ответ дан 6 December 2019 в 06:02
поделиться

Умножение количества элементов на sizeof(char) является вопросом личных предпочтений, так как sizeof(char) всегда 1. Однако если это делается для обеспечения согласованности, лучше использовать тип указателя получателя для определения размера элемента, а не указывать тип явно. И не бросайте результат malloc

tempSides = malloc(strlen(inSides) * sizeof *tempSides);

Конечно, при работе со строками с нулевым окончанием вы должны помнить о выделении дополнительного пространства для завершающего нулевого символа. Невозможно сказать, намерены ли вы сделать tempSides строкой с нулевым окончанием в этом случае, поэтому я не могу сказать, нужна ли она вам.

0
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: