0

明確にするためにアドレスを切り捨てたい。改善されたコードを探しているのではなく、16 進コードの減算が正しく機能していないように見える理由です。

「cname」と「arptr」から「ゼロ」を引いた最初の結果:

address of 'cname' is 0x7fff5fbff720
and of 'arptr' is     0x7fff5fbff720

わかりやすくするために不要な数字を切り捨てたいので、0x00000000f720 になると思って 0x7fff5fbf0000 を引きますが、

「cname」と「arptr」から「trunker」を差し引いた 2 番目の結果:

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;

}

OS X で Xcode を使用する

2012 年明けましておめでとうございます。

4

2 に答える 2

4

ポインター演算は、バイト/文字単位ではなく、指している単位で実行されます。

代わりにこれを試すことができます:

printf("address of cname is %p\nand of arptr is     %p\n",
    (char*)cname-zero, (char*)arptr-zero);
于 2012-01-01T16:56:48.717 に答える
2

標準によれば、ポインタ算術を使用して、元のオブジェクトの外側のアドレスを計算してはなりません (または、最大で末尾の 1 つ後)。ただし、最初に整数に変換すると、好きなことを行うことができます (後でポインターに戻すことは合法ですが、お勧めできません。安全でない派生ポインターである標準によると)。

より良い:

printf("address of cname is %zx\nand of arptr is     %zx\n",
       (intptr_t)cname-trunker,
       (intptr_t)arptr-trunker
      );

しかし、最後の 4 桁だけを表示したい場合は、これがさらに優れています。

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)
于 2012-01-01T18:01:43.430 に答える