Завдання 8 Дедлайн 30 листопада

Дайте відповіді на запитання:
1. Як визначити розмір оголошеного статичного масиву?
2. Оголосіть масив char для рядка «abсdef». Який його розмір і чому?
3. Опишіть два можливі результати роботи наступної програми.

#include <iostream>

int main() {
    int numbers[] {1, 2, 3};
    int i;
    for (i = 0; i <= 3; ++i) {
        std::cout << numbers[i] << std::endl;
    }
    return 0;
}

4. Чи правильним є код програми зі зворотним індексуванням для присвоєння першому елементу значення останнього елемента?

#include <iostream>


int main() {
    int size = 3;
    int numbers[] {1, 2, 3};
    numbers[0] = numbers[-1];
    std::cout << numbers[0] << std::endl;
    return 0;
}

Відповідь

1. Як визначити розмір оголошеного статичного масиву?
За допомогою оператора sizeof(): розмір масиву в байтах поділити на розмір в байтах будь-якого елемента (зазвичай першого):

int arr[4];
int size = sizeof(arr) / sizeof(arr[0]);

2. Оголосіть масив char для рядка «abсdef». Який його розмір і чому?

char arr[] = "abcdef";

Розмір масиву буде 7, оскільки рядок в кінці ще має термінальний символ ‘\0’.

3. Опишіть два можливі результати роботи наступної програми.

#include <iostream>

int main() {
     int numbers[] {1, 2, 3};
     int i;
     for (i = 0; i <= 3; ++i) {
         std::cout << numbers[i] << std::endl;
     }
     return 0;
 }

Масив numbers має три елементи, а цикл ітерує по чотирьом, це класична помилка доступу за межі масиву. Варіантів поведінки є три:

  • Segmentation fault, або “виліт” програми, зумовлений доступом за межі масиву.
  • У цьому випадку він малоймовірний, але такий варіант майже гарантований, якщо “сусідами” масиву по оголошенню є вказівники чи складні об’єкти.
  • Програма виведе 1, 2, 3 і сміття — наступна ділянка пам’яті не ініціалізована.
  • Це найбільш ймовірний варіант.
  • Програма виведе 1, 2, 3 і знову 3. Останнє — це насправді значення змінної i на момент виведення. Оскільки змінна i оголошена в коді одразу після масиву, то є шанс, що в пам’яті вона також розташована одразу після нього, фактично стане його продовженням.

4. Чи правильним є код програми зі зворотним індексуванням для присвоєння першому елементу значення останнього елемента?

#include <iostream>

int main() {
    int size = 3;
    int numbers[] {1, 2, 3};
    numbers[0] = numbers[-1];
    std::cout << numbers[0] << std::endl;
    return 0;
}

Код програми неправильний, бо в C++ немає вбудованого зворотного (від’ємного) індексування. numbers[-1] є доступом до пам’яті поза межами масиву. Попри це, програма може спрацювати правильно. Змінна size оголошена одразу перед масивом, має той же тип, що і елементи масиву, і теж має значення 3, як і останній елемент масиву. У тривіальних випадках змінні розташовані в пам’яті одна біля одної (хоча порядок оголошень може мінятись компілятором), тобто numbers[-1] це змінна size, або ж елемент “перед першим в масиві”.


Комментарии

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

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

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