Правильные методы копирования строк с помощью malloc

Я хочу скопировать строку «Лучшая школа» в новое место в памяти, какое из этих утверждений я могу использовать, чтобы зарезервировать для нее достаточно места

А. malloc(sizeof(“Best School”))

Б. malloc(strlen(“Best School”))

С. malloc(11)

Д. malloc(12)

Э. malloc(sizeof(“Best School”) + 1)

Ф. malloc(strlen(“Best School”) + 1)

Я все еще очень новичок в языке программирования C, поэтому я действительно не слишком уверен, какой из них работает хорошо. Но я буду рад, если кто-нибудь покажет мне, какие из них можно использовать и почему их следует использовать.

Спасибо.

Поскольку цель обучения — думать самостоятельно, пожалуйста, отредактируйте свой вопрос и аргументируйте каждую из возможностей. Помимо наличия ошибочных и хороших вариантов, это основано на мнении.

the busybee 10.11.2022 14:33

У тебя случайно нет контрольной на троечку в школе...? В таком случае надо было усерднее учиться.

Lundin 10.11.2022 14:38

Я закрою это как дубликат, так как верхний ответ в цели отвечает на вопрос.

Lundin 10.11.2022 14:39

@Lundin IMO, это немного более общий вопрос, не только о строковых литералах.

0___________ 10.11.2022 14:49

@ 0___________ Цель обмана объяснила, что такое нулевой терминатор. ОП этого поста не знает, отсюда и их замешательство. Кроме того, нам действительно не нужно отвечать на вопросы, которые выглядят так, как будто их потенциально задает кто-то, пытающийся списать на живом экзамене...

Lundin 10.11.2022 14:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
98
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Литеральные строки в 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

Другие вопросы по теме