用Calloc初始化void *缓冲区

时间:2018-11-22 18:24:50

标签: c arrays buffer dynamic-memory-allocation calloc

因此,我已经阅读了calloc的文档,并说它将初始化大小为n的{​​{1}}个对象,并将每个对象初始化为0

因此,在用C实现通用动态数组的实现之前,我决定使用size类型使其更简单。我曾经调用int,缓冲区中的每个整数都将初始化为calloc,这意味着一个空白空间。但是,当我将数据缓冲区从0更改为int *buffer时,我一直在想这是否可以正确初始化指向void **buffer的每个void指针。如果您执行NULL,我已经看到NULL被强制转换为0,但是int a = NULLvoid *p = 0一样吗?这就是void *p = NULL的实际用途吗?

2 个答案:

答案 0 :(得分:3)

NULL是保证不指向任何东西。 calloc所做的全部是malloc之后的零填充内存。

“空指针在概念上与未初始化的指针不同。已知空指针不会指向任何对象或函数;未初始化的指针可能指向任何地方。另请参阅问题1.30、7.1和7.31。”

”如上所述,每种指针类型都有一个空指针,并且不同类型的空指针的内部值可能不同。尽管程序员不需要知道内部值,但必须始终告知编译器哪种类型的指针。必须使用null指针,以便在必要时可以区分(请参阅问题5.2、5.5和5.6)。”

http://c-faq.com/null/null1.html

答案 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指针。