Я хочу скопировать строку «Лучшая школа» в новое место в памяти, какое из этих утверждений я могу использовать, чтобы зарезервировать для нее достаточно места
А. malloc(sizeof(“Best School”))
Б. malloc(strlen(“Best School”))
С. malloc(11)
Д. malloc(12)
Э. malloc(sizeof(“Best School”) + 1)
Ф. malloc(strlen(“Best School”) + 1)
Я все еще очень новичок в языке программирования C, поэтому я действительно не слишком уверен, какой из них работает хорошо. Но я буду рад, если кто-нибудь покажет мне, какие из них можно использовать и почему их следует использовать.
Спасибо.
У тебя случайно нет контрольной на троечку в школе...? В таком случае надо было усерднее учиться.
Я закрою это как дубликат, так как верхний ответ в цели отвечает на вопрос.
@Lundin IMO, это немного более общий вопрос, не только о строковых литералах.
@ 0___________ Цель обмана объяснила, что такое нулевой терминатор. ОП этого поста не знает, отсюда и их замешательство. Кроме того, нам действительно не нужно отвечать на вопросы, которые выглядят так, как будто их потенциально задает кто-то, пытающийся списать на живом экзамене...
Литеральные строки в C на самом деле являются массивами, включая нуль-терминатор.
Когда вы используете sizeof для литеральной строки, вы получаете размер массива, который, конечно же, включает нуль-терминатор внутри массива.
Таким образом, одним правильным способом для буквальной строки будет sizeof("Best School")
(или sizeof "Best School"
).
Вы также можете использовать strlen. Если у вас не строковый литерал, а другой массив или указатель на первый символ строки, вы должны использовать strlen
. Но теперь вы должны помнить, что strlen
возвращает длину строки без завершающего нуля. Поэтому вам нужно добавить один для этого.
Таким образом, другим правильным способом будет strlen("Best School") + 1
.
Использование магических чисел почти никогда не бывает правильным.
Использование sizeof
id ограничено только этим одним случаем (строковый литерал). Ti не будет работать, если у вас будет указатель, ссылающийся на строку. Прежде чем вы начнете лучше разбираться в языке C и «почувствуете» разницу между массивами и указателями, IMO вы всегда должны использовать strlen
Пример:
char *duplicateString(const char *str)
{
char *newstring = malloc(strlen(str) + 1);
if (newstring) strcpy(newstring, str);
return newstring;
}
В этом случае sizeof(str) даст размер указателя на char
(обычно 2, 4 или 8), а не длину строки, на которую ссылается str
Поскольку цель обучения — думать самостоятельно, пожалуйста, отредактируйте свой вопрос и аргументируйте каждую из возможностей. Помимо наличия ошибочных и хороших вариантов, это основано на мнении.