10

私はプロジェクトに取り組んでいますが、プロジェクトを完了できないこのエラーに遭遇し続けています。プログラムの実行中に作成されるオブジェクトを指すようにポインターの 1 つを初期化し、NULL. 次に、何が設定されているかを確認すると、値が返されますnil。どうしてそんなことが可能なのですか?C に nil ポインターが存在するとは信じていませんでした。これを回避する方法はありますか?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
4

7 に答える 7

15

%pprintfポインター型をフォーマットします。(nil)これは、ポインターのコンテキストでは特別な値であるため、null ポインターと print を区別します。null ポインターに対して 0 を出力する場合は、ポインターを整数にキャストし、%d代わりに次を使用します。

printf("Head: %d\n", (int) front);

まだ役に立つかもしれないので元の答え:

NULL0はorとして定義されたマクロな((void *) 0)ので、ポインタをNULL設定すると、 に設定するのとまったく同じになり0ます。アドレス 0 のメモリがプログラムに割り当てられることはないため、これは null ポインターを宣言する目的で機能します。

于 2011-01-20T07:55:07.163 に答える
3

を使用してポインターを出力すると、 POSIX printf 仕様からのこの引用に従ってprintf("%p", somePtr)実装定義の方法で出力されます(同様の文言は C99 仕様にも存在します)。

引数は void へのポインターでなければなりません。ポインターの値は、実装に依存する方法で、一連の印刷可能な文字に変換されます。

これは、ポインターが の場合、またはまたはNULLとして印刷するなど、必要に応じて印刷できることを意味すると思います。nil0x000000000

于 2011-01-20T08:04:24.760 に答える
3

使用する

printf("Head: %s, %d, %p\n", front, front, front);

印刷するHead: (null), 0, (nil)

ありがとうパッキア

于 2011-01-20T11:58:07.183 に答える
1

nil は、デバッガーが伝えていることだと思います。ほとんどのコンパイラでは、null は #define で 0 に設定されるだけなので、名前はそれほど重要ではありません。

于 2011-01-20T07:56:02.467 に答える
0

他の人が述べているように、C には nil ポインタなどはありません。

メモリ割り当てが失敗0し、ポインタに割り当てられている可能性があります。

于 2011-01-20T07:59:58.910 に答える
0

構造体ポインターを int でキャストした後、if ステートメントで期待される条件を提供します。

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p);
printf("The address of the variable is---ps->p---After Deletion--  %d \n",(int)ps->p);
if((int)ps->p){
printf("Again in Free\n");
doFree((void **)&ps->p);
}

出力:-

変数のアドレスは---ps->p---削除後--nil 変数のアドレスは---ps->p---削除後--0

if condition に対して false と評価されます。

于 2013-10-06T04:35:19.907 に答える
0

あなたの質問がポインター値を NULL と比較することである場合、printf() によって出力される値は重要ではありません。そのためにif(ptr==NULL)を実行できます。

    ptr = (nil) および NULL = (nil) => ptr = NULL :)

あなたが得ているエラーは、他の理由によるものでなければなりません。

于 2011-01-20T09:28:23.377 に答える