Дайте відповіді на запитання:
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, або ж елемент “перед першим в масиві”.
Добавить комментарий