Арифметика указателя C

Если вы являетесь пользователем ubuntu, после установки apache необходимо запустить следующую команду в новой установке

sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt

В моем случае это нормально.

13
задан unwind 29 January 2010 в 11:06
поделиться

5 ответов

Это на самом деле неопределено, согласно стандарту. Указатель арифметики не гарантируется работать, если указатели не указывают на элемент, либо только за пределы того же массива.

Соответствующий раздел стандарта составляет 6,5,6: 9 (тяга N1362 C1x, но это не изменилось, поскольку C99), которые состояния:

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

Вы, скорее всего, получите 250, если ваш int DataType - 4 байта, но нет никакой гарантии. Неопределенное поведение (в отличие от поведения, определяемое внедрением), означает просто то, что не определено. Что-нибудь может произойти, вплоть до общего разрушения большой доли пространства-времени.

Курс повышения квалификации:

  • Определенное поведение - это то, что указывается стандартом. Реализации должны сделать это, чтобы соответствовать.
  • Определенное внедрение поведение оставлено до реализации, но он должен четко документировать это поведение. Используйте это, если вам все равно не заботится о мобильности.
  • Неопределенное поведение означает, что все может произойти. Никогда не делай этого!
33
ответ дан 1 December 2019 в 19:07
поделиться

Как p указывает на int и поэтому q, q-p будет 1000.

-7
ответ дан 1 December 2019 в 19:07
поделиться

Q-P Предполагается, сколько шагов с увеличением вы должны сделать, чтобы перейти из P - Q . Который является 1000 / SIZEOF (INT) и равен 250. Помните Q ++ , фактически перейдем к следующему элементу типа int, не в середине этого, поэтому он должен добавить 4 фактическое значение указателя. Следовательно, результат.

2
ответ дан 1 December 2019 в 19:07
поделиться

В Linux процент использования памяти разделен на следующие уровни.

0 - 30% - без обмена 30 - 60% - коммутация грязных страниц 60 - 90% - Обмен чистыми страницами также на основе политики LRU.

90% - ссылаться на убийцу OOM (вне памяти) и убить процесс, потребляющий максимальную память.

Проверьте это - http://linux-mm.org/om_killer

В Think Windows может иметь аналогичную политику, поэтому вы можете проверить статистику памяти и убедиться, что вы никогда не попадаете на максимальный порог.

Один из способов прекратить потребление большего количества памяти - пойти спать и дать больше времени для запуска потоков очистки памяти.

-121--3024741-

Q - P составляет 250.

2000 - 1000 = 1000
1000 / sizeof(int) = 250

Указатель арифметики, предполагая, что размер (INT) составляет 4.


Редактировать: ОК, чтобы уточнить. В C, когда два указателя имеют один и тот же тип, то разница между ними определяется количество вещей указанного типа между ними. Например,
struct foo { int ar[1000]; } big[10];
char small[10];

struct foo *fs, *fe;
char *ss, *se;

fs = &big[0]; fe = &big[9];
ss = &small[0]; se = &small[9];

fe - fs == se - ss;

То есть разница между двумя указателями в этом случае является количество элементов массива между ними. В этом случае это 0, 1, ... 8 или 9 элементов.

8
ответ дан 1 December 2019 в 19:07
поделиться

Ответ : Q-P будет 250, предполагая, что вы на машине, где INT INT составляет 4 байта.

Расчет:

Q - P = 1000 1000/4 (размер INT) = 250

Идея позади этого :

Идея арифметики указателя в том, что если у вас есть INT на 1000 и INT Указатель на 2000 год и спросить разницу, вы не , спрашивая, что 2000-1000. То, что вы спрашиваете, это, Сколько INT Могу ли я поделиться между двумя.

Это очень удобно для всех видов операций, например:

int *i = 100;
i++; // This is **not** 101, it is 104, cause you actually want the next place an int could fit in memory.

Это особенно пригодится при работе с массивами. Массив INT (определен INT ARR [10] ) в основном рассматривается как указатель. Когда вы пишете ARR [5] , компилятор переводит его в * (ARR + 5) , то есть добавить 5 в int указатель под названием ARR и получите значение по этому адресу.

Причина, по которой это работает, заключается в том, что ART + 5 не означает означает «добавить 5 к значению ARM», это означает «добавить все равно необходимым к значению ARM Чтобы идти вперед 5 int s ", или, точнее," Добавить 5 * sizeof (int) к значению arr "

2
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

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