Malloc在malloc之前没有进行类型转换
这个问题在这里已经有了答案:
在你使用ptr
之前,你必须声明它,并且你的声明是如何声明的。
malloc
返回void *
,隐式转换为任何类型。
所以,如果你必须声明它
int *ptr;
ptr = malloc(sizeof(int)*N);
ptr
将指向一个整数数组,并且如果声明像
char *ptr;
ptr = malloc(sizeof(char)*N);
ptr
将指向一个char数组,不需要投射。
建议不要从malloc
返回值。
但我已经看到很多地方,他们不使用(* int)malloc之前,甚至我做了一个链表,并没有错误。 这是为什么?
因为他们(你也肯定)先前把变量声明为一个存储malloc
返回值的指针。
为什么指针需要知道除了指向的内存大小之外的任何内容?
因为指针也用于指针运算,并且取决于指向的类型。
在为指针分配空间之前,您需要声明指针
int *ptr;
由于malloc
返回类型是void *
,因此可以隐式转换为任何类型。 于是
ptr= malloc(sizeof(int)*N);
将为N
整数分配空间。
唯一的问题是ptr指向什么?
它指向sizeof(int) * N
大小的内存块。
编译器需要知道指针指向什么,以便它可以正确地进行指针运算。
你没有在你的代码中做任何指针算术,所以这不适用。 从malloc()
返回void *
是没问题的,因为void *
可以隐式转换为任何对象指针类型,也可以隐式转换为任何对象指针类型。
另请注意, 将返回值转换为(int *)
不会改变ptr
本身的类型。 所以它没有任何好处。 如果ptr
的类型是void *
,那么即使你写了,你也不能对它执行指针运算
void *ptr;
ptr = (int *)malloc(sizeof(int) * N);
我应该如何解释这个更好? 一个变量总是具有相同的类型,而不管分配给它的是哪种类型的值(例如,在这种情况下,将void *
分配给int *
是很好的,因为存在隐式转换。)
这就是为什么你不应该使用malloc()
的返回值:它没有任何好处。 它无助于正确性,它可以隐藏错误,并降低可读性。