因此,我已经阅读了calloc
的文档,并说它将初始化大小为n
的{{1}}个对象,并将每个对象初始化为0
因此,在用C实现通用动态数组的实现之前,我决定使用size
类型使其更简单。我曾经调用int
,缓冲区中的每个整数都将初始化为calloc
,这意味着一个空白空间。但是,当我将数据缓冲区从0
更改为int *buffer
时,我一直在想这是否可以正确初始化指向void **buffer
的每个void指针。如果您执行NULL
,我已经看到NULL
被强制转换为0
,但是int a = NULL
与void *p = 0
一样吗?这就是void *p = NULL
的实际用途吗?
答案 0 :(得分:3)
NULL是保证不指向任何东西。 calloc
所做的全部是malloc
之后的零填充内存。
“空指针在概念上与未初始化的指针不同。已知空指针不会指向任何对象或函数;未初始化的指针可能指向任何地方。另请参阅问题1.30、7.1和7.31。”
”如上所述,每种指针类型都有一个空指针,并且不同类型的空指针的内部值可能不同。尽管程序员不需要知道内部值,但必须始终告知编译器哪种类型的指针。必须使用null指针,以便在必要时可以区分(请参阅问题5.2、5.5和5.6)。”
答案 1 :(得分:0)
首先,请注意:标准实际上并未指定NULL指针按位等于零,只是NULL并不指向任何东西。但是,在大多数实现中,NULL按位等于0。
void *p = 0
会将p设置为仅包含0的指针。在您的计算机上,此可能与void *p = NULL
相同,但是C标准不能保证。
void **buffer = calloc(...)
会将void *p
中的每个buffer
设置为0
,可能对应于您计算机上的NULL
。< / p>
让我们看一下在整数和void指针均为4个字节的机器上的calloc(3, 4)
。 (请注意,整数和void指针并不总是4个字节;这仅出于说明目的。)calloc
在这种情况下将分配:
| 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
并返回一个指向上述内存的指针(数字代表以十六进制形式存储在内存中的值)。
如果我们进行int *buffer = calloc(3, 4)
,则buffer
的每4个字节将是一个值为0的整数。
如果我们执行void **buffer = calloc(3, 4)
,则buffer
的每4个字节将改为指向地址0的void*
。在NULL为按位0的计算机上,这与填充相同buffer
,带有NULL指针。