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