Почему я могу прочитать 3 структуры, выделяя только 2? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь понять, почему следующий код работает в C:

test *liste = NULL;

liste = malloc(sizeof(test)*2);
liste[0].number = 5;
liste[1].number = 10;
liste[2].number = 15;

printf("%d\n", liste[0].number);
printf("%d\n", liste[1].number);
printf("%d\n", liste[2].number);

Со структурой:

typedef struct test {
    int number;
} test;

Вывод:

5
10
15

Я думал, что создание только 2 элементов «теста» и доступ к более чем 2 (как здесь 3) приведет к нарушению доступа к памяти?Но почему это работает тогда?

Все больше запутывается здесь ...

1 Ответ

3 голосов
/ 31 мая 2019

Добро пожаловать в удивительный мир неопределенного поведения , где все может случиться!

В спецификации C сказано, что в некоторых случаях результат выполнения операции приводит к тому, что называется неопределенным поведением . Это означает, что нет никаких гарантий относительно того, что может произойти при выполнении этих операций. Программа может сразу аварийно завершить работу. Он может продолжать работать, но со случайными поврежденными областями памяти. Может показаться, что это не вызывает никаких побочных эффектов. Это может также заставить компьютер обрести разум и сочинять стихи. (Последний вариант маловероятен, но технически возможен!)

В вашем случае, если вы попытаетесь получить доступ к памяти, которой вы не владеете (здесь, считывая конец массива malloc 'ed), результатом будет неопределенное поведение. В вашей системе кажется, что в этом конкретном случае, когда вы проходите один шаг, это, по совпадению, не вызывает никаких проблем, но если вы идете дальше, это приводит к сбою. Причина этого, скорее всего, связана с особенностями вашего распределителя памяти и конкретной машины, на которой вы работаете. Это может вызывать раздражение, если вы работаете с таким языком, как Python или Java, где ошибки более конкретны и лучше определены.

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