Какой способ зарезервировать память для строки? - PullRequest
1 голос
/ 04 января 2010

Я создал макрос для резервирования памяти для моих строк в C . Это выглядит так:

#define newString(size) (char*)malloc(sizeof(char) + size)

Так есть ли причина, по которой я не должен использовать этот макрос в своих личных проектах? Я знаю, что не должен делать это в рабочем коде, потому что для этого потребуется, чтобы у всех был этот заголовочный файл, и чтобы все знали, что newString - это макрос.

Ответы [ 5 ]

5 голосов
/ 04 января 2010

(char*)malloc(sizeof(char) * (size+1)) было бы более подходящим (+1 - для учета NULL в конце строки, если применимо).

Если кто-то копирует строку, strlen () не учитывает NULL, заканчивающий строку, поэтому требуется дополнительная память char.

1 голос
/ 04 января 2010

Я не уверен, что стоит использовать препроцессор, чтобы сэкономить при печати. (Эта дорога темна и страшна.) Вскоре вам захочется добавить что-то в ваш макрос, и вы начнете сталкиваться с проблемами, которые будет сложно отлаживать.

Если вы используете собственное управление памятью, используйте реальную функцию и предоставьте бесплатную функцию «удаления».

Если вы беспокоитесь о производительности, ваш компилятор достаточно умен, чтобы встроить небольшие функции для вас.

0 голосов
/ 04 января 2010

Ваш макрос эквивалентен

malloc(size + 1)

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

0 голосов
/ 04 января 2010

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

malloc(size)

и это будет короче, чем newString(size). Кроме того, malloc возвращает void *, которое вам не нужно разыгрывать в C.

Другая причина в том, что вы не пишете +, когда имеете в виду *.

0 голосов
/ 04 января 2010

Вы должны проверить, было ли распределение успешным.

char* ptr = (char*)malloc(sizeof(char) * size); //Not '+' size!!
if (ptr == 0) //or NULL if defined
{
    //cannot allocate
}

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

...