C 指针的内存分配在两种情况下是否相同?

C 指针的内存分配在两种情况下是否相同?,c,C,指针的内存分配在两种情况下是否相同 struct_datatype * p=NULL; struct_datatype * p=malloc; 除了堆栈和堆的内存分配之外,这个问题还不清楚您在问什么 struct_数据类型*p=NULL 没有为p分配内存。它指向没有分配内存 struct_数据类型*p=malloc() 一些内存可能已分配,分配的内存地址已分配给p。如果malloc失败,NULL将被分配给p 注意:对于这两种情况,sizeofp将是sizeofstruct\u数据类型* 注意

指针的内存分配在两种情况下是否相同

struct_datatype * p=NULL;

struct_datatype * p=malloc;

除了堆栈和堆的内存分配之外,这个问题还不清楚您在问什么

struct_数据类型*p=NULL
没有为
p
分配内存。它指向没有分配内存

struct_数据类型*p=malloc()
一些内存可能已分配,分配的内存地址已分配给
p
。如果malloc失败,NULL将被分配给
p

注意:对于这两种情况,sizeof
p
将是sizeof
struct\u数据类型*


注意:指针变量
p
将在编译时在堆栈中分配内存,在这两种情况下,堆栈的大小都是
struct\u datatype*
。指针
p
中存储的地址可能指向用户地址空间中可访问的任何有效内存地址。在
NULL
情况下,未分配地址(且NULL不是用户可访问的地址),但在执行
malloc
时(如果成功)分配的内存地址将从堆空间分配给指针
p
,否则它将再次分配给NULL。

在第一种情况下,指针初始化为指向地址0,因此如果访问指针指向的数据,将出现0指针异常,因为指针没有指向可访问的内存位置。


在第二种情况下,p=(struct_数据类型*)malloc(sizeof(struct_数据类型));内存被分配并分配给指针,因此您可以通过p访问该内存,例如,如果x是结构中的int字段,您可以通过
p->x=123

设置该x。我不理解这个问题。第二行可能需要显式转换(指向函数的指针=>指向
struct_datatype
)您是否询问指针的大小?占用的内存总量?第一行在堆栈上分配的内存不比第二行多(即使您确实调用了
malloc
),第二行是可疑的-它是故意指向malloc函数的指针吗?@david:Assigning*p=NULL点为零,而,*p=一些有效地址点为一些可用内存。将指针指定为NULL和清空内存是两件不同的事情。很抱歉,问题不清楚。我知道使用malloc指针的类型。如果我们将这个指针变量传递给某个API,我怀疑这两种情况都会发生。根据API,它需要返回填充在结构中的数据。所以在这两种情况下,我的结构都充满了数据。如果不分配内存,是否会产生任何问题?是的。如果在API中,结构指针被访问,如果指针被指定为NULL,这意味着使用指针变量无法访问内存。因此,它可能会导致seg故障、零异常等,具体取决于编译器和平台。我建议,在访问指针变量并尝试将数据填充到指针分配的内存之前,在API中对指针本身进行空检查。感谢askmish的回复。很好askmish。感谢您识别错误。我的意思是基于上下文的
sizeof(struct\u datatype*)
。编辑。