Malloc在malloc之前没有类型转换

时间:2014-01-11 11:42:57

标签: c malloc

我正在学习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的怀疑才能做到。

4 个答案:

答案 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,那么你需要进行类型转换。