Желание урезать адрес для ясности не работает, как ожидалось
Желая обрезать адреса для наглядности. Не ищите улучшенного кода, просто почему вычитание шестнадцатеричного кода не работает должным образом.
Первый результат с вычитанием "нуля" из "cname" и "arptr":
address of 'cname' is 0x7fff5fbff720
and of 'arptr' is 0x7fff5fbff720
Желая обрезать ненужные цифры для ясности, я вычитаю 0x7fff5fbf0000, думая, что получу 0x00000000f720, но:
Второй результат с вычитанием 'trunker' из 'cname' и 'arptr':
address of 'cname' is 0xffff00014082f720
and of 'arptr' is 0xffff00014082f720
#include <stdio.h>
#define trunker 0x7fff5fbf0000
#define zero 0x000000000000
int main(void) {
char cname[3][3] = {'a','b','c','e','f','g','i','j','k'};
char (* arptr)[3];
arptr = cname;
printf("address of cname is %p\nand of arptr is %p\n",
cname-zero,arptr-zero); //replace zero with trunker
//to truncate first 8 digits
return 0;
}
Использование XCode на OS X
Спасибо и с Новым 2012 годом
2 ответа
Согласно стандарту, вы не должны использовать арифметику указателей для вычисления адресов за пределами исходного объекта (или не более одного после конца). Но если вы сначала преобразуете в целое число, вы можете делать все, что хотите (обратное преобразование в указатель впоследствии допустимо, но нежелательно. Согласно стандарту, который является небезопасно полученным указателем).
Лучше:
printf("address of cname is %zx\nand of arptr is %zx\n",
(intptr_t)cname-trunker,
(intptr_t)arptr-trunker
);
Но если вы просто хотите отобразить последние четыре цифры, это еще лучше:
printf("address of cname is %04x\nand of arptr is %04x\n",
(unsigned)cname & 0xffffU,
(unsigned)arptr & 0xffffU
);
Демонстрация: http://ideone.com/t8gQn
Избавляемся от предупреждений:
(unsigned)((intptr_t)someptr & 0xffffU)
Арифметика указателя выполняется в единицах, на которые указывает вещь, а не в единицах байтов / символов.
Вы можете попробовать это вместо этого:
printf("address of cname is %p\nand of arptr is %p\n",
(char*)cname-zero, (char*)arptr-zero);