我正在学习malloc功能,我读到了这个:
ptr= malloc(sizeof(int)*N)
Run Code Online (Sandbox Code Playgroud)
其中N是您要创建的整数.唯一的问题是ptr指出了什么?编译器需要知道指针指向什么,以便它可以正确地执行指针算法.换句话说,如果编译器知道ptr是指向int的指针,那么编译器只能将ptr ++或ptr = ptr + 1解释为继续执行下一个int的指令.只要您将ptr定义为指向要使用的变量类型的指针,这就可以工作.不幸的是,这引发了一个问题,即malloc如何知道指针变量的类型是什么 - 不幸的是它没有.
要解决此问题,您可以使用TYPE强制转换.这种C语言是一种强制某种特定类型的机制.您所要做的就是在值前面的括号中写入TYPE说明符.所以:
ptr = (*int) malloc(sizeof(int)*N)
Run Code Online (Sandbox Code Playgroud)
但是我在malloc之前看过很多他们没有使用过(*int)的地方,甚至我用这个做了一个链表并且没有错误.这是为什么?另外,为什么指针除了要指向的内存大小之外还需要知道什么呢?但话又说回来,我对此很陌生,所以现在只有malloc的怀疑.
在你可以使用之前ptr,你必须声明它,以及如何声明它是指针变为.
malloc返回void *隐式转换为任何类型的返回.
所以,如果你必须声明它
int *ptr;
ptr = malloc(sizeof(int)*N);
Run Code Online (Sandbox Code Playgroud)
ptr 将指向一个整数数组,如果你声明像
char *ptr;
ptr = malloc(sizeof(char)*N);
Run Code Online (Sandbox Code Playgroud)
ptr 将指向一个char数组,没有必要强制转换.
建议不要输入返回值malloc.
但是我在malloc之前看过很多他们没有使用过(*int)的地方,甚至我用这个做了一个链表并且没有错误.这是为什么?
因为它们(并且你肯定)先前将变量声明为存储返回值的指针malloc.
除了指向的内存大小之外,为什么指针需要知道什么呢?
因为指针也用于指针运算,这取决于它所指向的类型.