Иногда вы не получаете ошибку времени выполнения при доступе к вашему массиву вне диапазона в коде C. таких как:Ошибка сегментации массива C
char array[1024];
char* ptr = array;
*(ptr-10) = 'a';
//or
*(ptr-4096) = 'a';
Предполагая, что array
находится в стеке, мне любопытно, что МИН РАЗМЕР что позволит *(ptr-SIZE) = 'a'
бросить ошибку сегментации в любой ситуации?
, например:
*(ptr-4096*1024) = 'a' // this will always throw a segmentation fault
*(ptr-4096*8) = 'a' // sometimes this will not throw a segmentation fault
2017/1/10, новый добавил:
Сочувствую не постановка вопроса ясно. : (
То, что я хочу знать, это не просто неоднозначным UNDEFINED Предполагая, что стек высока, и куча мала Так расположение памяти будет:..
high *********
* stack * <- my array goes here
*********
* *
* * <- ptr may be here
* *
*********
* heap *
*********
* ??? * <- ptr may be here
*********
Конечно, я знаю, что
проблема заключается в том, что C/C++ фактически не делать какие-либо границы проверки в отношении массивов. это зависит от операционной системы, чтобы убедиться, что вы получаете доступ действительную память
Итак, приведенный выше код приведет к тому, что ядро ОС вызовет do_page_fault
и попытается найти vma
с адресом, и проверьте, есть ли vma->vm_start < address
.
Теперь, давайте вернемся к вопросу, я спросил: в MIN РАЗМЕР что позволит *(ptr-SIZE) = 'a'
бросить ошибку сегментации в любой ситуации. Другими словами, я хочу знать РАЗМЕР, который может позволить себе do_page_fault
. Это ничего не касается компилятора C, но как ваша ОС защищает вашу память.
Доступ к массиву за пределами границ [неопределенное поведение] (http://en.cppreference.com/w/cpp/language/ub) – George
Как насчет слова «undefined» как в «неопределенном поведении» неясно? Где вы слышали/читали/.. существует потребность в таком доступе для создания какого-либо конкретного поведения? – Olaf
Вам было бы лучше повторить это как вопрос ОС, «что должен сделать процесс пользовательского пространства, чтобы вызвать ошибку сегментации?» а не то, что, как представляется, является вопросом программирования на новичке C с тех пор, как он ответил. – TrentP