0
Queue queue = createQueue(); //queue to store int values
Node *node = getNode(8); 
enQueue(queue, (int)node);//storing an address in the int

..... some other statements ....

Node *root = (Node *) deQueue(queue);//typecasting an int to address
Node *left = root->left;

上記のコードでは、アドレスが割り当てられて格納されている間、キューは整数値を格納できます。問題を引き起こす可能性はありますか?

アドレスをintに格納することが問題になる可能性がある状況やアーキテクチャは何ですか?

いくつか例を挙げてください。

4

3 に答える 3

9

アドレスをintに格納することが問題になる可能性がある状況やアーキテクチャは何ですか?

ポインタが よりも大きいアーキテクチャint。つまり、ほとんどの 64 ビット システムです。タイプlong以上を使用できますintptr_t

于 2012-07-29T11:28:02.190 に答える
1

32 ビット システムでは、intlongのサイズはint*通常一致するので問題ありません。ただし、64 ビット アーキテクチャでポインタを整数に (およびその逆に) キャストすると、失敗する場合があります。

C99 または C11 では、オプション機能として(u)intptr_tfrom (ポインターstdint.hに格納された値を格納できる整数型) が存在します。void1 の補数を使用するマシンを除いて、多くのプラットフォームで動作します。

unsigned longC89 では、変数を使用できます。通常は機能します。しかし、なぜvoidポインターを使用しないのですか?

于 2012-07-29T15:02:26.657 に答える
1

仮定があなたのお尻を噛む奇抜なアーキテクチャに行く必要はありません。64 ビットのインテル アーチを使用してください。

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, const char *argv[])
{
    printf("sizeof int is %i\n", sizeof(int));
    printf("sizeof long is %i\n", sizeof(long));
    printf("sizeof void * is %i\n", sizeof(void *));

    exit(0);
}

出力する

sizeof int is 4
sizeof long is 8
sizeof void * is 8

そのため、問題が発生します。アドレスの上位 4 バイトを静かに切り捨てて、本質的にランダムなメモリを走り書きすることになるからです。

話の教訓: ポインターを扱っている場合は、ポインターを使用してください。

于 2012-07-29T14:58:46.087 に答える