ポインタのメモリ割り当ては両方のシナリオで同じですか
struct_datatype * p=NULL;
struct_datatype * p=malloc;
スタックとヒープからのメモリ割り当てとは別に ??
ポインタのメモリ割り当ては両方のシナリオで同じですか
struct_datatype * p=NULL;
struct_datatype * p=malloc;
スタックとヒープからのメモリ割り当てとは別に ??
最初のケースでは、ポインタはアドレス0を指すように初期化されます。したがって、ポインタが指すデータにアクセスすると、ポインタがアクセス可能なメモリ位置を指さないため、0ポインタ例外が発生します。
2番目のケースでは、p =(struct_datatype *)malloc(sizeof(struct_datatype)); メモリはポインタに割り当てられて割り当てられるため、pを介してそのメモリにアクセスできます。たとえば、xが構造体のintフィールドである場合、このxを次のように設定できます。p->x=123
質問はあなたが何を求めているのか明確ではありません。
struct_datatype * p=NULL;
にメモリが割り当てられていませんp
。割り当てられたメモリがないことを示します。
struct_datatype * p=malloc();
一部のメモリが割り当てられている可能性があり、割り当てられたメモリのアドレスがに割り当てられていp
ます。mallocが失敗した場合、NULLがに割り当てられp
ます。
注:sizeofp
はstruct_datatype*
、どちらの場合もsizeofになります。
注:ポインタ変数には、コンパイル時にどちらの場合もsizeofであるスタックp
内のメモリが割り当てられます。ポインタに格納されているアドレスは、ユーザーアドレス空間でアクセス可能な有効なメモリアドレスを指している可能性があります。アドレスが割り当てられていない場合(およびNULLがユーザーアクセス可能なアドレスではない場合) 、割り当てられた場合(成功した場合)、割り当てられたメモリのアドレスがヒープスペースからポインタに割り当てられます。それ以外の場合は、NULLに割り当てられます。struct_datatype*
p
NULL
malloc
p