Действительно ли это - корректный способ выделить память char*.
char* sides ="5";
char* tempSides;
tempSides = (char*)malloc(strlen(inSides) * sizeof(char));
Почти. Строки заканчиваются NULL, поэтому вы, вероятно, захотите выделить дополнительный байт для хранения байта NULL. То есть, хотя длина сторон
составляет 1 символ, на самом деле это 2 байта: { 5
, '\ 0'
}.
Это будет:
tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char));
, и если вы хотите скопировать его в:
strcpy(tempSides, sides);
Обратите внимание, что:
char *
; Итак, это будет:
char *tempSides = malloc(strlen(inSides) + 1);
Тем не менее, если вы хотите дублируйте содержимое inSides
, вы можете использовать strdup
, например:
char *tempSides = strdup(inSides);
if (tempSides != NULL) {
// do whatever you want...
free(tempSides);
}
С этим есть проблема. tempSides укажет на неинициализированный блок памяти размером 1. Если вы собираетесь скопировать строку сторон в tempSides, то вам нужно будет выделить размер на один байт длиннее, чтобы удерживать нулевой терминатор для строки. Значение, возвращаемое параметром strlen(), не включает нулевой терминатор в конце строки.
Как уже было отмечено, вы не выделили место для завершающего символа NUL. Но я также хотел указать на пару других вещей, которые могут сделать ваш код более лаконичным.
По определению, sizeof(char)
всегда равен 1, поэтому вы можете сократить строку выделения до:
tempSides = (char*)malloc(strlen(inSides) + 1);
Еще один момент - похоже, что вы дублируете строку. Есть встроенная функция, которая делает это за вас:
tempSides = strdup(inSides);
Она обрабатывает получение длины, выделение нужного количества байт и копирование данных.
Нет, не совсем. Как уже отмечали другие, вам нужно выделить место для терминатора 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;
}
Умножение количества элементов на sizeof(char)
является вопросом личных предпочтений, так как sizeof(char)
всегда 1. Однако если это делается для обеспечения согласованности, лучше использовать тип указателя получателя для определения размера элемента, а не указывать тип явно. И не бросайте результат malloc
tempSides = malloc(strlen(inSides) * sizeof *tempSides);
Конечно, при работе со строками с нулевым окончанием вы должны помнить о выделении дополнительного пространства для завершающего нулевого символа. Невозможно сказать, намерены ли вы сделать tempSides
строкой с нулевым окончанием в этом случае, поэтому я не могу сказать, нужна ли она вам.