Malloc在malloc之前没有进行类型转换

这个问题在这里已经有了答案:

  • 我输入malloc的结果吗? 27个答案

  • 在你使用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()的返回值:它没有任何好处。 它无助于正确性,它可以隐藏错误,并降低可读性。

    链接地址: http://www.djcxy.com/p/28425.html

    上一篇: Malloc works without type cast before malloc

    下一篇: Typecasting malloc C++