Что происходит, когда данные больше, чем объявляет malloc? - PullRequest
0 голосов
/ 08 октября 2019

Я новичок в C, и у меня есть вопрос о malloc. Вот код:

  int *array = malloc(3 * sizeof(int));
  if (array != NULL) {
     printf("success \n");
  }

  array[0] = 1;
  array[1] = 1;
  array[2] = 1;
  array[3] = 2; // I assume this should fail ?
  array[4] = 1; // I assume this should fail ?

  printf(" %d \n", array[3]);

Означает ли это, что malloc является только подсказкой выделения памяти, но не верхним пределом? Если да, как мне применить верхний предел в C?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

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

Ни компилятор, ни среда выполнения не обязаны выдавать какие-либо предупреждения или выдавать какие-либо исключения при записи после конца массива. От вас ожидают, что вы просто не делаете этого.

0 голосов
/ 09 октября 2019

В этом контексте манипуляции с памятью вам важно понять, что вы на самом деле делаете, когда объявляете это динамическое выделение памяти.

Ваш указатель «массива» находится в стекеи указывает на первый элемент (первые 4 байта) непрерывного блока памяти (12 байтов (3xsizeof (int))), который находится НА КАРТЕ.

Когда вы пытаетесь получить доступ к этой памяти пространства кучи,с помощью оператора [N] вы просите компилятор выполнить некоторую арифметику указателей, чтобы позволить вам получить доступ к данным, содержащимся в памяти, в месте (массив + (N) * sizeof (int)) НА ГОЛОВЕ.

Поэтому, когда вы пытаетесь получить доступ к массиву [3], вы пытаетесь получить доступ к 4-байтовой ячейке памяти, которая расположена непосредственно после последней области памяти, выделенной для вашего массива, это может быть много вещей, включая ваши собственные данные изпредыдущее распределение!

Как отмечалось в других ответах на этот пост, это неопределенное поведение, и его следует избегать, так какВы не можете контролировать, какими данными вы манипулируете, когда получаете доступ к данным «за пределами».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...