假设“structName”是已定义的结构:structName ** sarray = (structName **) malloc(0 * sizeof(structName *));
我知道它创建了一个指向名为sarray的结构指针的指针,但是为什么(structName**)放在表达式的开头呢?另外,为什么在malloc调用中结构大小乘以0?
代码的来源是here
最佳答案
malloc
返回void *
。指针类型为sarray
。structName **
是一个类型转换,将(structName **)
转换为void *
。指针在C语言中是非常有延展性的;structName **
总是返回一些可以安全地转换为任何类型指针的内容。在本例中,您有一个指向malloc
的指针。
用structName *
乘以sizeof(structName *)
做你想做的事,要求0
获得零长度的内存块。我怀疑malloc
在里面,因为作者认为它是标准模式。您可以移除它而不产生任何后果,只需提供0。如果sizeof
与realloc
参数一起工作,您也可以将NULL
初始化为sarray
。
作为记录,对于NULL
:
如果请求的空间大小为零,则行为为
实现定义的:返回一个空指针,或者
行为就像大小是一些非零值,除了
返回的指针不能用于访问对象。
因此,初始调用可能返回也可能不返回malloc
,返回的结果基本相同:通过指针访问任何内容都应具有未定义的结果。