c++ - 保存变量的地址
高洛峰
高洛峰 2017-04-17 14:30:00
0
2
763
#include <cstdio>
int main(int argc, char const *argv[])
{
    int aa[10]={1,2,3,4};
    int * a = aa;
    for (int i = 0; i < 4; ++i)
    {
    unsigned int b = (int)&a[i];
    printf("%p : %x\n",&a[i],b );
    }
}

b保存的是a[i]的地址,但是正常编译会出错,

a.cpp:6:24: warning: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
  unsigned int b = (int)a;
                        ^

通过-fpermissive参数之后,error变成warning可以正常运行,某次的结果如下:

0x7ffeac7db3d0 : ac7db3d0
0x7ffeac7db3d4 : ac7db3d4
0x7ffeac7db3d8 : ac7db3d8
0x7ffeac7db3dc : ac7db3dc

为什么输出会不一样?
另外,如何正常保存变量的地址到一个数组,以便后续对这个“地址数字”进行操作?(就是后面想对0x7ffeac7db3d0这样的数据进行操作,而不是看成一个地址了)

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
左手右手慢动作

質問の対象は 64 ビット マシンですか?コンパイルエラーを見ると、変換がエラーの原因となっているようです。 64ビット、ポインタは8バイト、intは4バイトです。これをlong longに変更してコンパイルしたのがこの問題のようです。

リーリー

アドレスをlong long配列に保存し、整数として扱うと、処理できるようになります。

いいねを押す +0
巴扎黑

エラーメッセージを表示

リーリー

は、int*int に変換すると精度が失われることを意味します。 int* 型と int 型が占有するメモリ サイズが異なるためです。
-fpermissive パラメータを使用すると、トレラント モードが強制され、精度が失われる可能性があります。
通常、マシンはリトルエンディアン (ここにあるもの) なので、整数を変換するときに、それ以上のビットを格納できない場合は、下位ビット、つまり仮数部のみを格納できます。

メモリ アドレスの保存には int などの型を使用しないで、対応するポインター型または void* 型を使用してください。 linux の下にあるはずです。intptr_t を使用することをお勧めします。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート