Указатель массива никогда не вызывает ошибки? - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть кое-что, чего я не понимаю.

Вот что я делаю:

float* test = (float*) malloc(4 * sizeof(float) );

А потом я попытался сделать

test[100] = 1.0;
printf("%f\n",test[100]);

И ... Это сработало ...

Я ждал ошибки сегментации, но нет, и я не понимаю, почему. Я хотел сделать это, чтобы убедиться, что мой массив был правильно выделен. Я действительно этого не ожидал, и, может быть, я что-то упустил, поэтому я искал в Интернете, и кажется, что все получают segfault ... Поэтому я пришел сюда, чтобы спросить. Спасибо

1 Ответ

0 голосов
/ 03 ноября 2018

То, что вы вызвали, - неопределенное поведение - в этом случае оно работает как положено, но это ужасная идея - полагаться на него любым способом: оптимизация компилятора или изменение операционной системы могут внезапно вызвать «странное» поведение. Вы должны прочитать больше на эту тему, хотя в двух словах, с неопределенным поведением, компилятору разрешено делать все, что он хочет.

У меня недостаточно знаний, чтобы быть уверенным, но я предполагаю, что ваша операционная система подготовила целую страницу памяти для вашей программы. В Linux по умолчанию это 4 КиБ, и вы получили доступ к байту до 400, так что еще есть много места. Таким образом, вы можете получать доступ к памяти, выделенной для вашей программы, поскольку операционная система работает с блоками памяти не менее 4 КиБ.

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