Для цикла, пропускающего несколько индексов с segfault

(этот ответ относится только к стороне CSS вещей ...)

Как само собой разумеющееся, я всегда нацеливаюсь на дочерние TD так:

tr.odd td {}
tr.even td {}

Причина Дело в том, что IE фактически применяет цвет фона TR, удаляя значение, установленное в TR, и применяя его к каждому отдельному TD в пределах этого TR. Иногда у вас может быть сброс CSS или другие правила CSS, которые отменяют странный способ IE делать цвет фона TR, так что это способ убедиться, что вы этого избегаете.

Кроме того, вы можете рассмотреть возможность установки только

tr td {background-color: #EEDDEE}

и

tr.odd td {background-color: #EEEEDD}

, чтобы ваш код был немного менее подробным

5
задан 1 June 2009 в 18:15
поделиться

5 ответов

Что происходит, когда вы пишете в массив [5], вы пишут i. Они находятся рядом в стеке, в памяти, так что это ожидаемое поведение.

Подумайте об этом так,

вы создали массив из 5 элементов в

int array[5];

на самом деле, массив - это просто адрес . число в [] указывает, как далеко от этого адреса требуется доступ. Итак:

  • массив [0] 0 целых чисел в памяти, прошедший адрес «массив»
  • массив [1] - это 1 целых числа в памяти после адреса «массив» ...
  • array [4] - это 4 целых числа в памяти за адресом «array» (последнее целое число, которое вы зарезервировали для array)

, поэтому, если вы дойдете до

  • array [5], это будет 5 целых чисел в памяти, прошедший адрес "array"

В C нет автоматической проверки границ, поэтому можно перезаписать вашу собственную память. Вы поместили «i» в стек после array [5], скорее всего, array [5] будет i.

Вы просто установили array [5] или i равным 22, следовательно, i равно 22. Теперь, когда i равно 22, ваш следующий поиск в array [i] действительно является array [22]. Это захватывает весь мусор, оказавшийся в этом месте памяти; или, если повезет, вылетает.

7
ответ дан 18 December 2019 в 09:52
поделиться

Как только вы переполните выделенную память, вы окажетесь на «неопределенной территории». Вероятно, запись в массив записывалась туда, где в стеке хранился «i».

Обратите внимание, что в отличие от языков, таких как Java и C #, C не выполняет проверку границ времени выполнения, поэтому не гарантируется, что он сделает что-нибудь полезное (например, segfault) когда вы переполняете массив, строку или поврежденную память. Это не гарантирует что-либо. Он мог разбиться, он мог продолжать работать, он мог заставить демонов вылететь из носа .

9
ответ дан 18 December 2019 в 09:52
поделиться

@Doug есть, но давайте немного расширим его.

У вас есть array [5] и i в качестве автоматических переменных, поэтому они размещаются в стеке при входе, поэтому вы выделить 6 ячеек: array [0], array [1], ... array [4], а затем i.

Когда вы устанавливаете i в 5, array [i] указывает на ячейку в стеке, содержащую i. Затем вы назначили ему 22. Итак, теперь, когда вы напечатали, i = 22.

Затем вы получаете array [i] или array [22], которые находятся на конце стека; случайное значение оказывается тем большим числом.

2
ответ дан 18 December 2019 в 09:52
поделиться

Скорее всего, хранилище для локальной переменной «i» находится сразу после «array» в стеке, поэтому & array [5] == & i, что означает, что вы назначаете 22 для «i» когда вы присваиваете 22 массиву [5].

0
ответ дан 18 December 2019 в 09:52
поделиться

Вы объявили массив из 5 целых чисел, но цикл for записывает значения в 10 записей.

Измените

int array[5];

на

int array[10];
-1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: