2012-05-31 2 views
2

Можно создать дубликат:
Why do these two pointer subtractions give different results?поведение указателей при typecasted

char arr[] = "stackoverflow"; 
char *p1 = arr; 
char *p2 = arr + 3; 
printf("%d", (int*)p2 - (int*)p1); 

это ответ 0..Can вы объяснить, почему это так?

+1

Пожалуйста, убедитесь, что код скомпилирован в первую очередь ... – kennytm

+1

Что такое 'ptr1'? – dirkgently

ответ

4

Потому что p2 - p1 является < sizeof (int). Итак, (int *) p2 - (int *) p1 == 0, количество int элементов между двумя указателями.

+0

THNX человек, я получил его! woo Я просто пропустил часть da :) – vijay

3

Потому что вы вызываете поведение, определяемое реализацией/неопределенным. int, вероятно, имеет размер 4 на вашей платформе, поэтому по крайней мере один из этих указателей неправильно выровнен.

На практике это, вероятно, потому, что компилятор делает что-то вроде (p2/4) - (p1/4) под капотом.

+0

... или даже '(p2-p1) & ~ 3' :-) – dasblinkenlight

+0

Откуда взялось ~ 3? – Kylo

+0

Разве это не просто вывернутое * неопределенное поведение? Вы пытаетесь выполнить арифметику указателей на недопустимые указатели, период. –

0

Я думаю, что вы, вероятно, имел в виду, чтобы сделать это:

printf("%d", (int)(p2 - p1)); 

Но это даже не требует преобразования, поскольку разница между двумя указателями возвращает подписанный целочисленный тип (ptrdiff_t), так что вы можете оставить на приведение типа и изменить "%d" на "%td".

+1

Если вы опускаете актерский состав, вам нужно использовать модификатор длины 't':' printf ("% td", p2 - p1); ''% d' для 'int' аргумент. – ouah

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