需要使用malloc和指针来理解这段代码
以下是维基百科关于malloc()的文章中的一小段代码:
int *ptr;
ptr = malloc(10 * sizeof (*ptr)); // Without a cast
ptr = (int*)malloc(10 * sizeof (int)); // With a cast
我想知道是否有人能帮助我理解这里发生了什么。 所以,从我所知道的情况来看,似乎是这样发生的:
1)初始化一个指向NULL的整数指针。 它是一个指针,所以它的大小是4字节。 解引用这个指针将返回值NULL。
2)由于C允许这种类型的自动转换,因此不包含转换为整型指针是安全的。 我无法破译究竟是什么被喂入malloc函数,虽然(以及为什么)。 看起来我们正在获得ptr的解除引用值的大小。 但是这不是NULL吗? 所以NULL的大小是0,对吧? 为什么我们乘以10?
3)最后一行与上面相同,只是明确声明了一个强制转换。 (从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倍于单个整数的大小; 调用的返回值是指向该内存的指针。
第一行声明一个指向整数的指针,但不初始化 - 所以它指向一些随机的内存,可能无效。 ptr
的大小是指向int
任何大小的指针,可能是4或8个字节。 它指向的大小,当它指向某个有效的位置时,通过解引用它可以得到的大小是int
大小。
第二行为堆中的10个int
分配足够的内存,然后将其分配给ptr
。 不使用malloc()
转换,但由malloc()
返回的void *
自动转换为分配时需要的任何类型的指针。 sizeof (*ptr)
给出了解除引用的ptr
的大小,即ptr
指向( int
)的大小。 对于sizeof
, ptr
是否指向有效内存并不重要,只是类型是什么。
第三行就像第二行,但有两个变化:它显式将void *
return从malloc()
转换为int *
,以匹配ptr
的类型; 它使用int
类型的sizeof
而不是该类型的表达式,如*ptr
。 明确的演员没有必要,有些人强烈反对使用它,但最终归结为偏好。
malloc()
s ptr
应该指向堆上的有效位置并且可以安全地取消引用之后,只要malloc
成功。
对于第2行malloc()分配足够的内存来容纳10个指针。
malloc()是一个通用函数void,所以它必须转换为你实际想要使用的任何类型,在上面的例子中指向int。
链接地址: http://www.djcxy.com/p/28473.html上一篇: Need assistance in understanding this code using malloc and pointers