Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Изменение константных данных

1.8K
05 августа 2007 года
igor_nf
256 / / 13.12.2006
Объясните пожалуйста, следующее:
 
Код:
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;

не приводит к аналогичным последствиям? Компилятор по-разному выделяет память для различных типов?
3
05 августа 2007 года
Green
4.8K / / 20.01.2000
Потому что buffer overflow - это аварийная ситуация и может привести к чему угодно.
1.9K
06 августа 2007 года
[*]Frosty
278 / / 17.06.2006
Помоему так оба куска вполне "рабочие". Си не запрешает лазить за границы массивов(хотя это опасно). Какой компилятор?
11-го в первом варианте и 5-го во-втором случае элементов нет.
Хотя в первом случае есть 10 элемент - код конца строки.
И странно то, что автор приводит в каждом примере по два массива! Что он хотел сказать?
1.8K
06 августа 2007 года
igor_nf
256 / / 13.12.2006
[QUOTE='
  • Frosty;205250']Помоему так оба куска вполне "рабочие". Си не запрешает лазить за границы массивов(хотя это опасно). Какой компилятор?
    11-го в первом варианте и 5-го во-втором случае элементов нет.
    [/QUOTE]
    Да то понятно, что элементов нет. После выполнения первого куска кода printf(arr1) показывает: X123456789. Вывод: переписался первый элемент arr1[]. Получается, память для массивов arr1 и arr2 выделяется строго последовательно: сразу за последним элементом arr1[] идёт первый элемент arr2[]: &arr1[11] == &arr2[0]. То есть для изменения элементов массива arr1[] мы используем доступ через arr2[] с несуществующим индексом. Жульничество, конечно, в программе такое использовать не нужно, но непонятно, почему во втором случае такой фокус не проходит.
  • 240
    06 августа 2007 года
    aks
    2.5K / / 14.07.2006
    Цитата: igor_nf
    Жульничество, конечно, в программе такое использовать не нужно, но непонятно, почему во втором случае такой фокус не проходит.


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

    1.8K
    06 августа 2007 года
    igor_nf
    256 / / 13.12.2006
    Понятно, всего лишь случайность. Всем спасибо.
    350
    08 августа 2007 года
    cheburator
    589 / / 01.06.2006
    static const char arr1[] = "0123456789";
    Думаю, это уменьшит вероятность того, что такая "случайность" прокатит.
    Насколько мне известно, статические константные данные помещаются (по крайней мере, в Windows) в отдельную секцию исполнимого файла, которая размещается в страницах памяти read-only. Таким образом, попытка записи туда будет отслеживаться на аппаратном уровне, вызовется исключение, и скорее всего, вылезет окошко типа "Память по адресу ..... не может быть "write"".
    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог