(nil)c/c ++のポインター
-
13-10-2019 - |
質問
私はプロジェクトに取り組んでおり、プロジェクトを完了することができないこのエラーに出くわし続けます。ポインターの1つを初期化して、プログラムの実行中に作成されるオブジェクトを指すとき、それを初期化します NULL
. 。次に、それが何を設定しているかを確認すると、次の値が返されます nil
. 。そのようなことはどうですか?私はCにnilのポインターが存在するとは信じていませんでした。これを取り巻く方法はありますか?
struct order_line *front = NULL;
...
printf("Head: %p\n", front); // prints -> Head: (nil)
解決
%p
の printf
ポインタータイプをフォーマットします。これにより、ヌルポインターと印刷が区別されます (nil)
ポインターのコンテキストでは特別な価値があるからです。 nullポインターに0を出力する場合は、ポインターを整数にキャストして使用します %d
代わりは:
printf("Head: %d\n", (int) front);
それはまだ有用かもしれないので、元の答え:
NULL
と定義されているマクロです 0
また ((void *) 0)
, 、したがって、ポインターを設定した場合 NULL
設定とまったく同じです 0
. 。これは、アドレス0のメモリがプログラムに割り当てられないため、ヌルポインターを宣言することを目的としています。
他のヒント
使用してポインターを印刷するとき printf("%p", somePtr)
, 、anで印刷されています 実装定義の方法, 、からのこの引用に従って posix printf仕様 (C99仕様にも同様の言葉遣いが存在します)。
議論はボイドへのポインターでなければなりません。ポインターの値は、実装に依存する方法で、印刷可能な文字のシーケンスに変換されます。
私は、これはポインターが NULL
, 、それはそれを印刷することを印刷するかもしれませんが、それをとして印刷することを含めます nil
また 0x00000000
また 0
.
使用する
printf("Head: %s, %d, %p\n", front, front, front);
印刷する Head: (null), 0, (nil)
Packiaに感謝します
私はあなたのデバッガーがあなたに言っていることだと思います。ほとんどのコンパイラでは、nullはとにかく#define ed edにあるので、その名前はそれほど重要ではありません。
他の人が述べたように、Cにはnilpointerのようなものはありません
メモリの割り当てが失敗し、引き起こされる可能性があります 0
ポインターに割り当てられます。
あなたの質問がポインター値をnullと比較することについての場合、printf()によって印刷された値は問題ではありません。あなたはまだできます if(ptr == null) そのために。
- ptr =(nil)およびnull =(nil)=> ptr = null :)
他の理由のために、あなたが取得しているエラーは必須です。
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 ---削除後 - 変数のアドレスは--- ps-> p ---削除後 - 0です。
条件の場合はfalseに評価されます。