Программирование на С Malloc не работает правильно

Когда я создаю динамический массив:

int *arr = (int *) malloc( 4 * sizeof(int) );

Таким образом, он должен содержать как 4 целых числа (может быть, 2 или 3 для проблем с пространством), но почему это работает:

    for ( int x = 0; x < 30000; x++) {
         arr[x] = x;
     }

Я имею в виду, что не должно быть так много места для 30 000 переменных, и все работает нормально, в чем может быть причина? Это автоматический перераспределение, как с c ++ std :: vector или как я могу это понять?

Если бы я поместил диапазон цикла как 50.000, он потерпит крах, но он должен даже потерпеть крах, как при индексе [100] или раньше, потому что массив состоит из 4 элементов.

Я использую GNU / Linux, если это имеет значение.

Я очень стараюсь понять это.

Пожалуйста помоги

Всего 2 ответа


Как упомянуто в комментариях выше, C не является языком «проверки границ» (если это то, что вам нужно, есть много альтернатив, от D до Nim, которые можно легко смешать с чистым ANSI C ).

Теперь вернемся к вашему вопросу.

То, что вы сделали, это выделить немного памяти для 4-х дюймов. Все идет нормально.

Тот факт, что вы можете получить доступ к другим частям памяти (или большему количеству памяти, чем было изначально выделено - см. Вне диапазона ) и избавиться от этого, не означает, что вы должны это делать. Может произойти сбой или нет. Это то, что можно назвать «неопределенным поведением».

Теперь, если вы хотите быть в безопасности , просто сделайте это так, как вы должны:

  1. Выделите память, которая вам нужна
  2. Доступ к нему - всегда в пределах досягаемости
  3. Освободи, когда закончишь

C не несет ответственности за ограничения вашего массива. Если вы хотите убедиться, что вы не переполняете выделенное пространство, вам нужно создать переменную, которая представляет размер выделенного пространства, и использовать ее как в команде malloc, так и в цикле for.

Ваше понимание C необходимо улучшить, чтобы вы понимали, как использование языка низкого уровня имеет свои ограничения и обязанности.

C имеет проверку псевдопамяти для массивов символов, которая выполняется путем установки нуля (0) в конце каждой «строки», но это относится только к определенным методам и приемам.


Есть идеи?

10000