以下是维基百科关于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允许这种类型的自动转换,因此不包括转换为int-pointer的指针是安全的。我无法解读究竟正在为malloc函数提供什么(以及为什么)。看起来我们正在获得ptr的解除引用值的大小。但是这不是NULL吗?所以NULL的大小是0,对吗?为什么我们乘以10?
3)最后一行与上面的内容完全相同,只是显式声明了一个强制转换。 (从void指针强制转换为int指针)。
答案 0 :(得分:4)
我假设我们在这里谈论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倍;调用的返回值是指向该内存的指针。
答案 1 :(得分:1)
第一行声明一个指向整数的指针,但不初始化它 - 所以它指向一些随机的内存,可能是无效的。 ptr
的大小是int
的大小指针,可能是4或8个字节。它指向的大小,当它指向某个有效位置时,通过取消引用它得到的大小是int
具有的大小。
第二行从堆中为10 int
分配足够的内存,然后将其分配给ptr
。不使用强制转换,但void *
返回的malloc()
会自动转换为分配时需要的任何类型的指针。 sizeof (*ptr)
给出了解除引用 ptr
的大小,即ptr
指向的大小(int
)。对于sizeof
,ptr
是否实际指向有效内存并不重要,只要类型是什么。
第三行与第二行类似,但有两处更改:它明确地将void *
从[{1}}返回到malloc()
,以匹配{{1}的类型};它使用类型名称为int *
的{{1}}而不是ptr
类型的表达式。明确的演员表是没有必要的,有些人强烈反对它的使用,但最终归结为偏好。
sizeof
int
中的任何一个应指向堆上的有效位置,并且只要*ptr
成功,就可以安全取消引用。
答案 2 :(得分:0)
对于第2行 malloc()分配足够的内存来容纳10个指针。
malloc()是一个通用函数 void 所以它必须强制转换为您实际想要使用的任何类型,在上面的示例指针中指向int。