需要帮助理解使用malloc和指针的代码吗

需要帮助理解使用malloc和指针的代码吗,c,pointers,types,malloc,C,Pointers,Types,Malloc,以下是维基百科关于malloc()的文章中的一小段代码: 我想知道是否有人能帮我理解这里发生了什么。所以,据我所知,似乎发生了这样的事情: 1) 初始化指向NULL的整数指针。它是指针,因此其大小为4字节。取消引用此指针将返回空值 2) 因为C允许这种类型的自动转换,所以不包括转换到int指针是安全的。但是,我很难理解到底是什么输入到malloc函数中(以及为什么)。我们似乎得到了ptr的解引用值的大小。但这不是空的吗?所以NULL的大小是0,对吗?为什么我们要乘以10 3) 最后一行与上面一样

以下是维基百科关于malloc()的文章中的一小段代码:

我想知道是否有人能帮我理解这里发生了什么。所以,据我所知,似乎发生了这样的事情:

1) 初始化指向NULL的整数指针。它是指针,因此其大小为4字节。取消引用此指针将返回空值

2) 因为C允许这种类型的自动转换,所以不包括转换到int指针是安全的。但是,我很难理解到底是什么输入到malloc函数中(以及为什么)。我们似乎得到了ptr的解引用值的大小。但这不是空的吗?所以NULL的大小是0,对吗?为什么我们要乘以10


3) 最后一行与上面一样,只是显式声明了一个cast。(从void指针转换为int指针)。

我假设我们在这里讨论的是C。对于C++,答案是不同的。 1) 这完全是错误的
ptr
是指向
int
的指针,仅此而已。它未初始化,因此没有确定的值。取消引用它是未定义的行为——您肯定不会得到0!指针也很可能不指向0。
ptr
的大小是
sizeof(ptr)
,或
sizeof(int*)
;没有别的了。(充其量您知道这不大于
sizeof(void*)


2/3)在C中,永远不要强制转换malloc的结果:
int*p=malloc(sizeof(int)*10)。代码为10个整数分配足够的内存,即单个整数大小的10倍;调用的返回值是指向该内存的指针。

我假设这里讨论的是C。对于C++,答案是不同的。 1) 这完全是错误的
ptr
是指向
int
的指针,仅此而已。它未初始化,因此没有确定的值。取消引用它是未定义的行为——您肯定不会得到0!指针也很可能不指向0。
ptr
的大小是
sizeof(ptr)
,或
sizeof(int*)
;没有别的了。(充其量您知道这不大于
sizeof(void*)


2/3)在C中,永远不要强制转换malloc的结果:
int*p=malloc(sizeof(int)*10)。代码为10个整数分配足够的内存,即单个整数大小的10倍;调用的返回值是指向该内存的指针。

第一行声明了指向整数的指针,但没有初始化它——因此它指向某个随机内存块,可能是无效的。
ptr
的大小是指向
int
的指针的大小,可能是4字节或8字节。它所指向的大小,当它指向某个有效的地方时,你可以通过解引用它得到,它是一个
int
所具有的大小

第二行从堆中为10个
int
s分配足够的内存,然后将其分配给
ptr
。不使用强制转换,但是
malloc()
返回的
void*
会自动转换为指定时需要的任何类型的指针。
sizeof(*ptr)
给出了解除引用的
ptr
的大小,即
ptr
指向的内容的大小(一个
int
)。对于
sizeof
,无论
ptr
是否实际指向有效内存,都无关紧要,只要指向有效内存类型即可

第三行与第二行类似,但有两个变化:它显式地将
void*
返回从
malloc()
转换为
int*
,以匹配
ptr
的类型;它使用类型名为
int
sizeof
,而不是该类型的表达式,如
*ptr
。明确的演员阵容是没有必要的,一些人强烈反对使用它,但最终归结为偏好


malloc()
s之后,只要
malloc
成功,那么
ptr
应该指向堆上的一个有效位置,并且可以安全地取消引用。

第一行声明一个指向整数的指针,但没有初始化它——因此它指向某个随机内存块,可能无效。
ptr
的大小是指向
int
的指针的大小,可能是4字节或8字节。它所指向的大小,当它指向某个有效的地方时,你可以通过解引用它得到,它是一个
int
所具有的大小

第二行从堆中为10个
int
s分配足够的内存,然后将其分配给
ptr
。不使用强制转换,但是
malloc()
返回的
void*
会自动转换为指定时需要的任何类型的指针。
sizeof(*ptr)
给出了解除引用的
ptr
的大小,即
ptr
指向的内容的大小(一个
int
)。对于
sizeof
,无论
ptr
是否实际指向有效内存,都无关紧要,只要指向有效内存类型即可

第三行与第二行类似,但有两个变化:它显式地将
void*
返回从
malloc()
转换为
int*
,以匹配
ptr
的类型;它使用类型名为
int
sizeof
,而不是该类型的表达式,如
*ptr
。明确的演员阵容是没有必要的,一些人强烈反对使用它,但最终归结为偏好

在任何一个
malloc()
s
ptr
之后,只要
malloc
成功,就应该指向堆上的有效位置,并且可以安全地解除引用。

对于第2行malloc()正在分配足够的内存来容纳10个指针

malloc()是一个通用函数void int *ptr; ptr = malloc(10 * sizeof (*ptr)); // Without a cast ptr = (int*)malloc(10 * sizeof (int)); // With a cast