Желание урезать адрес для ясности не работает, как ожидалось

Желая обрезать адреса для наглядности. Не ищите улучшенного кода, просто почему вычитание шестнадцатеричного кода не работает должным образом.

Первый результат с вычитанием "нуля" из "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);
Другие вопросы по тегам