2015-03-24 3 views
-3

Я тестировал некоторый код для класса, который обертывает 2-мерный массив struct.Почему этот доступ не связан с segfault?

WrapperClass x; 
SomeStruct try1 = x.at(0, 0); 
SomeStruct try2 = x.at('a', 1); 
SomeStruct array[] = {try1, try2}; 
// There were originally 3 of these test variables above, but I forgot to 
// change the loop upper bound when I deleted one 
for (int i = 0; i < 3; i++) { 
    // I added this line after noticing the non-error 
    std::cout << &array[i] << '\n'; 
    std::cout << array[i].property1 << '\n'; 
    std::cout << array[i].property2 << '\n'; 
    std::cout << array[i].property3 << '\n'; 
    std::cout << "-\n"; 
} 
return 0; 

Это выходы:

0x7ffdadface08 
0 
0 
0 
- 
0x7ffdadface14 
0 
0 
0 
- 
0x7ffdadface20 
0 
0 
0 

Почему этот код выдаёт ошибку сегментации с «доступом из границ» ошибки или что-то? Я создал только 2 структуры в массиве; почему вдруг появляется третий, который я могу свободно и безопасно получить?

+0

Просьба предоставить полный тестовый пример, чтобы воспроизвести это поведение! –

+0

Не требуется, и автоматическая проверка границ будет платить за то, что вам не нужно в каждом случае. – chris

+0

Это пример, почему магические числа - это плохая вещь. Вместо 3-х в коде вы должны где-то определить константу. –

ответ

3

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

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