我正在学习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,那么你需要类型转换。