2016-04-05 3 views
-5

Хотелось бы знать, почему это происходит. Я создаю 5-элементный массив целых чисел - каждый элемент занимает 4 байта в памяти. Почему, когда я печатаю адрес myArray [-1], я также получаю действительный адрес?Память, используемая массивами

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int myArray[] = {1, 2, 3, 4, 5}; 

    printf("0x%p\n0x%p\n0x%p\n", &myArray[-1], &myArray[0], &myArray[1]); 

    return 0; 
} 

Выход: 0x0028FEF8 0x0028FEFC 0x0028FF00

+4

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что «объясните UB», –

ответ

2

Поскольку неопределенное поведение не определено: она может работать или нет, вы не гарантированно получить ошибку сегментации.

2

Адрес не действует; он не соответствует объекту в вашей программе. Попытка доступа к этой ячейке памяти приводит к неопределенным поведением - это может вызвать ошибку времени выполнения. Или нет.

Практически любая реализация, ваш массив будет материализован в большей области хранения, поэтому, естественно, будут ячейки памяти по обе стороны от этого массива (если он не начинается с адреса 0, который он не будет почти на любом вы на самом деле будете работать). Поскольку C не применяет никаких ограничений на проверку доступа к массиву, он не сразу бросает исключение, когда вы используете индекс -1. Да, вы получаете то, что выглядит как разумное значение адреса, но при попытке использовать, что расположение памяти может или не может привести к какому-либо хаосу в зависимости от того, что там хранится (например, указатель кадра). Определение языка оставляет поведение undefined; он не требует от компилятора требования обрабатывать ситуацию каким-либо определенным образом. Компилятор может выдать диагностику, что вы делаете что-то глупое и прекращаете перевод. Это может скомпилировать код без жалобы, и вы не будете знать, что что-то не так, пока не получите ошибку времени выполнения. Он может делать что-то среднее между ними.

Смежные вопросы