我正在学习malloc功能&我读到了这个:
ptr= malloc(sizeof(int)*N)
其中N是您要创建的整数。唯一的问题是ptr指出了什么?编译器需要知道指针指向的是什么,以便它可以正确地执行指针算法。换句话说,如果编译器知道ptr是指向int的指针,那么编译器只能将ptr ++或ptr = ptr + 1解释为继续执行下一个int的指令。只要您将ptr定义为指向要使用的变量类型的指针,这就可以工作。不幸的是,这引发了一个问题,即malloc如何知道指针变量的类型是什么 - 不幸的是它没有。
要解决此问题,您可以使用TYPE强制转换。这种C语言是一种强制某种特定类型的机制。您所要做的就是在值前面的括号中写入TYPE说明符。所以:
ptr = (*int) malloc(sizeof(int)*N)
但我在malloc& amp;之前看过很多他们不使用的地方(* int)。甚至我用这个做了一个链表,没有错误。这是为什么? 另外,为什么指针除了要指向的内存大小之外还需要知道什么呢? 但是我再次对此很陌生,所以现在只有malloc的怀疑才能做到。
答案 0 :(得分:9)
在使用ptr
之前,您必须声明它,以及如何声明它是指针变为。
malloc
返回隐式转换为任何类型的void *
。
所以,如果你必须声明它像
int *ptr;
ptr = malloc(sizeof(int)*N);
ptr
将指向一个整数数组,如果您声明为
char *ptr;
ptr = malloc(sizeof(char)*N);
ptr
将指向一个char数组,不需要强制转换。
建议不要从malloc
转换返回值。
但我见过许多地方,他们之前没有使用(* int) malloc&甚至我用这个做了一个链表,没有错误。为什么是 是什么?
因为他们(并且你肯定)先前将变量声明为存储来自malloc
的返回值的指针。
为什么指针需要知道除了内存大小以外的任何内容 指着?
因为指针也用于指针运算,这取决于它所指向的类型。
答案 1 :(得分:1)
在为指针分配空间之前,需要声明指针
int *ptr;
由于malloc
的返回类型为void *
,因此可以隐式转换为任何类型。因此
ptr= malloc(sizeof(int)*N);
将为N
整数分配空间。
答案 2 :(得分:1)
唯一的问题是ptr指出了什么?
它指向一个大小为sizeof(int) * N
的内存块。
编译器需要知道指针指向什么,以便它可以正确地执行指针算法。
您的代码中没有进行任何指针运算,因此不适用。从void *
返回malloc()
很好,因为void *
可以隐式转换为任何对象指针类型。
另请注意,将返回值转换为(int *)
而不是会更改ptr
本身的类型。因此它不会好。如果ptr
的类型为void *
,则即使您编写了
void *ptr;
ptr = (int *)malloc(sizeof(int) * N);
我该如何更好地解释这个? 变量始终具有相同的类型,,无论您为其分配的是哪种类型的值(例如,在这种情况下,将void *
分配给int *
都很好,因为有一个隐式转换。)
这就是不应强制转换malloc()
的返回值的原因:它没有任何好处。它没有帮助正确性,它可以隐藏错误,并降低可读性。
答案 3 :(得分:1)
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,那么你需要进行类型转换。