const char arr1[] = "0123456789";
char arr2[] = "0123456789";
arr2[11] = 'X';
Изменение константных данных
Код:
Такой код ведёт к изменению данных в массиве arr1. Почему же тогда
Код:
const short int arr1[] = {11111, 11112, 11113, 11114};
short int arr2[] = {11115, 11116, 11117, 11118};
arr2[5] = 0;
short int arr2[] = {11115, 11116, 11117, 11118};
arr2[5] = 0;
не приводит к аналогичным последствиям? Компилятор по-разному выделяет память для различных типов?
Потому что buffer overflow - это аварийная ситуация и может привести к чему угодно.
11-го в первом варианте и 5-го во-втором случае элементов нет.
Хотя в первом случае есть 10 элемент - код конца строки.
И странно то, что автор приводит в каждом примере по два массива! Что он хотел сказать?
11-го в первом варианте и 5-го во-втором случае элементов нет.
[/QUOTE]
Да то понятно, что элементов нет. После выполнения первого куска кода printf(arr1) показывает: X123456789. Вывод: переписался первый элемент arr1[]. Получается, память для массивов arr1 и arr2 выделяется строго последовательно: сразу за последним элементом arr1[] идёт первый элемент arr2[]: &arr1[11] == &arr2[0]. То есть для изменения элементов массива arr1[] мы используем доступ через arr2[] с несуществующим индексом. Жульничество, конечно, в программе такое использовать не нужно, но непонятно, почему во втором случае такой фокус не проходит.
Цитата: igor_nf
Жульничество, конечно, в программе такое использовать не нужно, но непонятно, почему во втором случае такой фокус не проходит.
да потому что, то что в первый раз так получилось - это ничего совершенно не значит. И вывод непраильный. результат по сути может быть каим угодно.
Понятно, всего лишь случайность. Всем спасибо.
Думаю, это уменьшит вероятность того, что такая "случайность" прокатит.
Насколько мне известно, статические константные данные помещаются (по крайней мере, в Windows) в отдельную секцию исполнимого файла, которая размещается в страницах памяти read-only. Таким образом, попытка записи туда будет отслеживаться на аппаратном уровне, вызовется исключение, и скорее всего, вылезет окошко типа "Память по адресу ..... не может быть "write"".