Завдання 12 Дедлайн 18 грудня

в

1. Чи є в наступному коді помилка роботи з динамічною пам’яттю?

const char* c = new char[20] {"Hello, world!"};
std::cout << c << std::endl;
delete c;

2. Чи будуть вказувати str1 та str2 на однакову адресу?

const char* str1 = "Hello, world!";
const char* str2 = "Hello, world!";

3. Яким є розмір об’єкта наступної структури і чому?

struct Struct {
   int method();
};

4. По порядку опишіть дії, які виконуються перед початком кожної ітерації циклу в коді нижче. Коли цикл зупиниться?

const char* c = "Hello, world!";
char v;
while (v = *c++) {
    // ...
}

Відповідь:

  1. Так, використано оператор delete а не delete[]. Хоч це не завжди матиме негативні наслідки (як, наприклад, витік пам’яті), але завжди є помилкою з точки зору логіки роботи програми.
  2. Не обов’язково. Хоча зазвичай адреса буде одна і та ж, але стандарт C++ не визначає те, як зберігаються однакові літерали.
  3. Попри те, що в Struct немає полів, розмір об’єкта буде 1 байт. Якби розмір був 0, то адреса такого об’єкта співпадала би з адресою іншої змінної, якщо алокація відбувається на стеку. Також було б неможливо алокувати масив об’єктів даного типу, бо це завжди 0 байт, незалежно від кількості об’єктів.
  4. Перед початком кожної ітерації відбуваються наступні окремі дії:
  • Вказівник c збільшується на 1 — зсув на один символ вперед. Постінкремент має більший пріоритет ніж розіменування. Результат роботи постінкремента — вказівник на попередній символ. Тобто для найпершого кроку вираз “c++” повертає вказівник на символ ‘H’, а не на ‘e’, хоча змінна с вже буде вказувати на ‘e’.
  • Відбувається розіменування вказівника, отриманого в попередньому кроці.
  • Для найпершого кроку, “*c++” перетвориться в ‘H’.
  • Результат попереднього кроку присвоюється змінній v.
  • Перевіряється, чи змінна v дорівнює нулю, що є числовим значенням символа ‘\0’, який неявно проставлений після останнього символу ‘!’. Якщо дорівнює, то цикл припинить роботу.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 1 ГБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Перетащите файл сюда