使用calloc初始化void*缓冲区

使用calloc初始化void*缓冲区,c,arrays,buffer,dynamic-memory-allocation,calloc,C,Arrays,Buffer,Dynamic Memory Allocation,Calloc,因此,我已经阅读了calloc的文档,它说它将初始化n大小为size的对象,并将每个对象初始化为0 因此,在用C实现通用动态数组之前,我决定使用inttype来简化它。我曾经调用calloc,缓冲区中的每个整数都将初始化为0,这意味着一个空白。但是,当我将数据缓冲区从int*buffer更改为void**buffer时,我一直在想,这是否正确地初始化了指向NULL的每个空指针。我见过NULL被转换为0如果你这样做int a=NULL,但是void*p=0与void*p=NULL一样吗?这就是ca

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


因此,在用C实现通用动态数组之前,我决定使用
int
type来简化它。我曾经调用
calloc
,缓冲区中的每个整数都将初始化为
0
,这意味着一个空白。但是,当我将数据缓冲区从
int*buffer
更改为
void**buffer
时,我一直在想,这是否正确地初始化了指向
NULL
的每个空指针。我见过
NULL
被转换为
0
如果你这样做
int a=NULL
,但是
void*p=0
void*p=NULL
一样吗?这就是
calloc
实际所做的吗?

首先,需要注意的是:标准实际上没有指定NULL指针按位等于零,只是NULL不指向任何东西。然而,在大多数实现中,NULL按位等于0

void*p=0
将p设置为只包含0的指针。在您的计算机上,这可能与
void*p=NULL
相同,但C标准不保证这一点

void**buffer=calloc(…)
buffer
中的每个
void*p
设置为
0
,这可能对应于计算机上的
NULL

让我们看看
calloc(3,4)
,在一台整数和空指针都是4字节的机器上。(请注意,整数和空指针并不总是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的计算机上,这与使用NULL指针填充
缓冲区相同。

NULL保证不指向任何内容。
calloc
所做的就是在
malloc
之后零填充内存

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

“如上所述,每种指针类型都有一个空指针,不同类型的空指针的内部值可能不同。虽然程序员不需要知道内部值,但必须始终告知编译器需要哪种类型的空指针,以便在必要时进行区分。”(见问题5.2、5.5和5.6)。”


最后,一切都只是一个数字,并以数字的形式存储。因此,此时的内存将为0。另一件事是如何计算它,在本例中,如果访问此指针,则会有一个空指针。还有@Yastanub。另一件事是如何计算它,在本例中,如果访问此指针,则会有一个空指针一个空指针。–不,不能保证
NULL
与所有的零都是一样的。@Swardfish是的,重复,不知道为什么我在一个小时的搜索后找不到这个问题。谢谢!@LeoVen那么你真的必须在@Swardfish上下功夫了我的google fu能力做得很好,考虑到这个标题很烂我只是希望我的问题能填补另一个空白,像这样的问题无法解决。有趣的是:我已经看到了在某个微控制器上重置软件系统的
void(*reset)(void)=NULL;reset();
(不记得是哪一个,可能是AVR)。显然不符合标准-要做到这一点,NULL需要与起始地址不同,它可能已被分配所有位1,然后。。。