Я учусь на экзамене по структурам данных и алгоритмам.Один из примеров вопросов, связанных с динамическим распределением памяти, требует, чтобы вы создали функцию, которая передает строку и копирует ее в определенный пользователем указатель на символ.Вопрос предоставляет структуру тела для начала.Я сделал что-то вроде этого:
typedef struct smart_string {
char *word;
int length;
} smart_string;
smart_string* create_smart_string(char *str)
{
smart_string *s = (smart_string*)malloc(sizeof(smart_string));
s->length = strlen(str);
s->word = malloc(s->length);
strcpy(s->word, str);
return s;
}
Но ответ был такой:
typedef struct smart_string {
char *word;
int length;
} smart_string;
smart_string *create_smart_string(char *str)
{
smart_string *s = malloc(sizeof(smart_string));
s->length = strlen(str);
s->word = malloc(sizeof(char) * (s->length + 1));
strcpy(s->word, str);
return s;
}
Я пошел по коду: блоки и проверил их оба, чтобы увидеть какие-либо существенные различия.Насколько я знаю, их выходные данные были одинаковыми.
Я сделал свой код таким, какой он есть, потому что я подумал, что если мы выделим определенный блок памяти для s->word
, то это должно бытьто же число байтов, что и s ->length
, потому что это строка, которую мы хотим скопировать.
Однако правильный ответ ниже умножает sizeof(char)
(что составляет всего 1 байт) на s->length + 1
.Почему нужно добавить 1
к s->length
?Какова важность умножения s->length
на sizeof(char)
?Какие ошибки я допустил в своем ответе, на которые мне следует обратить внимание?