-2

Program to see memory allocation

#include<stdio.h>

main()
{
    char *p;
    printf("the address of p is = %u\n",p);
}

What is the difference

#include<stdio.h>

main()
{
    char *p;
    printf("the address of p is = %u\n",&p);
}
4

3 に答える 3

1

最初のプログラムは、初期化されていない自動変数 (p) を使用し、引数に一致しない printf 書式指定子 (unsigned int とオブジェクトへのポインター) を使用する未定義の動作により、ガベージを出力します。2 番目のものは、p のアドレスを出力します (ただし、技術的には未定義の動作も呼び出します)。

于 2013-06-08T12:10:44.113 に答える
1

最初のプログラムは、符号なし整数として解釈された初期化されていないポインター p の値を出力します。ポインターは初期化されていないため、出力される値は、たまたまその場所にある値です。2 番目のプログラムは、符号なし整数として解釈されたポインター p のアドレスを出力します。技術的には合法ではありませんが、sizeof(char *) == sizeof(unsigned int) であるほとんどのシステムで動作します。変数「p」は自動変数であるため、ランタイムが C スタックに割り当てるアドレス範囲の値を取得します。

編集:コメントから明確にする。Printf は、制御文字列に従って、パラメーターで渡されたデータをフォーマットします。%u は、符号なし整数を出力することを意味します。だから、あなたが通過するときp、C はポインター変数の値を printf に渡します。渡されるバイト数は、そのプラットフォームの sizeof(pointer) によって異なります。通常、printf は、制御文字列の後にパラメーターとして渡されたデータの型が制御文字列内のすべての % ディレクティブと一致する場合にのみ「機能」します。しかし、sizeof(onetype) == sizeof(another-type) の場合、私が書いたことは正しいです: printf は、特定のパラメーター位置のビットを、制御文字列の対応する場所で指定された型であると解釈します。sizeof(pointer) == sizeof(unsigned int) の場合、得られるのは unsigned int として出力されたポインターの値です。

于 2013-06-08T12:10:18.770 に答える
0

あるメモリアドレスにポインタ変数が割り当てられ、変数が別のメモリアドレスを指しています。

     +---+                +-------------------+
     | p | -------------> |     variable      |
     +---+                +-------------------+
 Address: 0xBBBBBBBB     Address: 0xAAAAAAAA

次のようなコードを作成できます。

int a = 5;
int* p = &a; // p, located at 0xBBBBBBBB will point to a, located at 0xAAAAAAAA

変数のアドレスを出力すると、0x(stuff) だけが返されます。

& < 変数> = 変数が配置されているアドレス。それが変数であるかポインター (それ自体が変数である) であるかに関係なく

于 2013-06-08T12:19:52.583 に答える