Malloc 在 malloc C/C++ 之前没有类型转换



我正在学习malloc函数,我读到这个:

ptr= malloc(sizeof(int)*N)

其中N是要创建的整数数。

唯一的问题是ptr指向什么?编译器需要知道指针指向什么,以便它可以正确地执行指针算术。换句话说,如果编译器知道 ptr 是指向整数的指针,则只能将ptr++ptr=ptr+1解释为移动到下一个整数的指令。

只要将变量 ptr 定义为指向要使用的变量类型的指针,这就可以工作。

不幸的是,这提出了一个问题,即 malloc 如何知道指针变量的类型是什么 - 不幸的是它不知道。

要解决此问题,您可以使用 TYPE 强制转换。这种 C 游戏是一种将值强制为特定类型的机制。您所要做的就是在值之前的括号中写下 TYPE 说明符,即:

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

问题

  • 我见过很多地方,他们在malloc之前不使用(*int),甚至没有错误地实现链表。为什么?

  • 为什么指针需要知道除了它们指向的内存大小之外的任何内容?

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

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++ 中使用 malloc,那么你需要类型转换。

相关内容

  • 没有找到相关文章

最新更新