Возможный дубликат:
Почему эти два вычитания указателя дают разные результаты?
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
это ответ 0.. Можете ли вы объяснить, почему это так?
Возможный дубликат:
Почему эти два вычитания указателя дают разные результаты?
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
это ответ 0.. Можете ли вы объяснить, почему это так?
Потому что p2 - p1
это < sizeof (int)
. Итак, (int *) p2 - (int *) p1 == 0
, количество int
элементов между двумя указателями.
Потому что вы вызываете поведение, определенное/неопределенное реализацией. int
, вероятно, имеет размер 4 на вашей платформе, поэтому по крайней мере один из этих указателей выровнен неправильно.
На практике это, вероятно, потому, что компилятор делает что-то вроде (p2 / 4) - (p1 / 4)
под капотом.
(p2-p1) & ~3
:-) 31.05.2012 arr
, ни arr + 3
не являются допустимыми int *
и поэтому арифметика с ними не определена. 31.05.2012 Я думаю, что вы, вероятно, хотели сделать следующее:
printf("%d", (int)(p2 - p1));
Но это даже не требует преобразования, потому что разница между двумя указателями возвращает целочисленный тип со знаком (ptrdiff_t
), так что вы можете опустить приведение типов и заменить "%d"
на "%td"
.
t
: printf("%td", p2 - p1);
%d
соответствует аргументу int
. 31.05.2012