Желание урезать адрес для ясности не работает, как ожидалось - PullRequest
0 голосов
/ 01 января 2012

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

Первый результат с вычитанием «нуля» из «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 ]

4 голосов
/ 01 января 2012

Арифметика указателя выполняется в единицах, на которые указывает вещь, а не в единицах байтов / символов.

Вы можете попробовать это вместо этого:

printf("address of cname is %p\nand of arptr is     %p\n",
    (char*)cname-zero, (char*)arptr-zero);
2 голосов
/ 01 января 2012

Согласно стандарту, Вы не должны использовать арифметику указателей для вычисления адресов за пределами исходного объекта (или не более одного после конца) . Но если вы сначала преобразуете в целое число, вы можете делать все, что хотите (обратное преобразование в указатель впоследствии допустимо, но нецелесообразно. Согласно стандарту, небезопасный указатель .)

Лучше:

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)
...