Должен ли он использовать realloc? - PullRequest
2 голосов
/ 08 октября 2011

Посмотрев код C на несколько проектов с открытым исходным кодом, я не уверен, что все делаю правильно.

Когда я создаю строки (char *), я обычно делаю это:

#define DEF_LEN 10
char *mystring;
mystring = malloc(DEF_LEN*sizeof(char));

Когда я меняю строку (обычно это делается внутри функции):

mystring = realloc(mystring, strlen(newstring)*sizeof(char)+1);
strcpy(mystring,newstring);

На многих проектах с открытым исходным кодом я вижу, что многие разработчики просто делают:

char another_string[1024];

Вопросы:

  • Можно ли использовать realloc хорошо?
  • Является ли realloc убийцей производительности (как это используется в моем коде / очень часто)?

1 Ответ

8 голосов
/ 09 октября 2011

Ух ты ...

mystring = realloc(mystring, strlen(newstring) * sizeof(char) + 1);

серьезный нет-нет в C .Если realloc терпит неудачу, то вы теряете свою способность на free mystring, поскольку вы перезаписали его NULL.

С точки зрения производительности и надежности мне всегда нравились буферы фиксированной длины настек.Это действительно зависит от ваших требований.Если у вас есть ограничения на наборы данных, тогда использование буферов фиксированной длины - это замечательно.Вы просто должны быть очень осторожны, чтобы не переполнить буферы, а что нет.Опять же, в C вы всегда должны заботиться о том, чтобы NUL завершать буферы и следить за тем, чтобы вы не переполняли их.

...