2013-03-15 2 views
0

Итак, у меня есть этот код:Почему это не произошло?

int randomNumber; 
int max = 16; 
int swap; 
int table[16]; 

srand(time(NULL)); 
for (int i = 0; i < 16; ++i) 
    table[i] = i + 1; 

for (int i = 0; i < 16; ++i) { 
    randomNumber = rand() % max; 
    swap = table[max]; 
    table[max] = tablica_losowa[losuj]; 
    table[losuj] = swap; 
    --max; 
} 

Очевидно, что эта проблема должна быть в первом проходе через секунду-цикл, когда макс == 16 и я пытаюсь получить доступ к таблице [макс], но он составлен и работает нормально.

Это приложение iPad (новейшее программное обеспечение), написанное на Objective-C, XCode 4.6, Apple LLVM Compiler 4.2.

Любые подсказки?

ответ

3

Доступ к памяти, принадлежащей чему-то другому, не гарантирует краха, это гарантирует только то, что вы делаете то, что вам не нужно. То, что произойдет, зависит от того, что такое ячейка памяти и как она используется.

Компилятор просто ничего не делает, чтобы вызвать проблему. Цель C основана на C ... в некоторых отношениях она немного туже, но C даст вам попробуйте, чтобы делать много вещей независимо от того, насколько они недопустимы, если синтаксис верен. В вашем случае запись в таблицу [16] может записывать в ячейку памяти, которая не имеет значения. Это может быть запись в swap, которая затем перезаписывается. Проверьте сборку, чтобы убедиться.

+0

Да, вы правы, и я знаю об этом, но я привык к сбою кода при доступе к массивам вне диапазона. Вы знаете, является ли это поведение конкретным для Objective-C, iPad (управление памятью?) Или, может быть, компилятором? Честно говоря, я ищу более подробный ответ, если это возможно :) – Losiowaty

+0

Я думаю, что OP из Java или подобного фона, где outOfBound Exceptions генерируются и разбиваются. –

+1

Losiowaty компилятор просто ничего не делает для _cause_ проблемы здесь. Я думаю, @AnoopVaidya правильно, что ваш опыт может быть с языком, где окружающая среда приводит к крушению в этом случае? Объектив C основан на C ... он немного тугое в некоторых отношениях, но C - это язык, который позволит вам _try_ делать много вещей независимо от того, насколько они недопустимы, если синтаксис верен. В вашем случае запись в таблицу [16] может быть записана в ячейку памяти, которая не важна. Это _might_ следует записывать в _swap_, который затем перезаписывается. Проверьте сборку, чтобы убедиться. – mah

0

Проблема в том, что C (и Objective-C) не дает никаких гарантий относительно «неопределенного поведения». Доступ к границам без границ table[16] - такое неопределенное поведение (см. Стандарт C11 6.5.6).

Это «предоставление гарантий» в случае неопределенного поведения идет очень далеко. Тогда ваша программа может делать что угодно. Он может сделать снимок с веб-камеры и опубликовать его на facebook, отправить нападающему письмо вашему боссу, а затем начать форматирование жесткого диска. Хотя это и не очень вероятно, это поведение было бы полностью справедливым с точки зрения того, что говорит этот язык.

Таким образом, просто игнорирование ошибки и продолжение выполнения программы, очевидно, тоже хорошо.

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