关于C#:malloc在malloc之前没有类型转换

Malloc works without type cast before malloc

本问题已经有最佳答案,请猛点这里访问。

我正在学习malloc函数,我阅读了以下内容:

1
ptr= malloc(sizeof(int)*N)

其中n是要创建的整数。唯一的问题是PTR指向什么?编译器需要知道指针指向什么,这样才能正确地执行指针运算。换言之,如果编译器知道ptr是指向int的指针,则只能将ptr++或ptr=ptr+1解释为继续执行下一个int的指令。只要将ptr定义为指向要使用的变量类型的指针,这就有效。不幸的是,这引发了malloc如何知道指针变量的类型的问题——不幸的是,它不知道。

要解决此问题,可以使用类型转换。这个c对单词的播放是一种机制,用于强制值为特定类型。您所要做的就是在值前面的括号中编写类型说明符。所以:

1
ptr = (*int) malloc(sizeof(int)*N)

但在malloc&;之前,我见过很多地方他们不使用(*int),甚至我也用它制作了一个链接列表,没有任何错误。为什么会这样?另外,为什么指针需要知道除了它们指向的内存大小以外的任何东西?不过,我又一次对这件事感到陌生,所以现在只有马尔洛克怀疑论能做到。


在使用ptr之前,必须声明它,以及如何声明它是指针。malloc返回的void *被隐式转换为任何类型。

所以,如果你必须像

1
2
int *ptr;
ptr = malloc(sizeof(int)*N);

ptr将指向一个整数数组,如果声明为like

1
2
char *ptr;
ptr = malloc(sizeof(char)*N);

ptr将指向一个char数组,不需要强制转换。

建议不要从malloc中投射返回值。

But I have seen many places that they don't use (*int) before the
malloc & even I made a linked list with this and had no errors. Why is
that?

因为它们(当然还有您)以前将变量声明为一个指针,用于存储来自malloc的返回值。

why do pointers need to know anything except the size of memory they
are pointing to?

因为指针也用于指针算术,这取决于指针指向的类型。


1
2
3
4
malloc returns pointer of type void and void type pointer is implicitly
converted to any type so if you don't use typecast then it will also work
int *ptr;
ptr=malloc(sizeof(int)*N)

但是如果在C++中使用MALOC,则需要进行类型转换。


The only problem is what does ptr point at?

它指向一块大小为sizeof(int) * N的内存。

The compiler needs to know what the pointer points at so that it can do pointer arithmetic correctly.

您在代码中没有执行任何指针算术,因此这不适用。从malloc()返回void *很好,因为void *可以隐式转换为任何对象指针类型或从任何对象指针类型转换。

还要注意,将返回值强制转换为(int *)不会改变ptr本身的类型。所以没有任何好处。如果ptrvoid *类型,那么即使编写了

1
2
void *ptr;
ptr = (int *)malloc(sizeof(int) * N);

我该如何更好地解释这一点?变量总是具有相同的类型,不管您为其分配的值是什么类型(例如,在这种情况下,将void *分配给int *是很好的,因为存在隐式转换。)

这就是为什么你不应该计算malloc()的回报值:它没有任何好处。它不能帮助正确性,它可以隐藏错误,降低可读性。


在为指针分配空间之前,需要声明指针

1
int *ptr;

由于malloc的返回类型是void *,因此可以隐式转换为任何类型。因此

1
ptr= malloc(sizeof(int)*N);

将为N整数分配空间。