malloc() 总是返回字符指针吗?

Nam*_*ess 1 c pointers

我有一本书,上面写着以下内容:

\n
\n

malloc() 分配仍然存在一个小问题。我们仍然需要解释一下温度 malloc() 的左侧部分。(int\n*) 是做什么用的?

\n

(int *) 是一个类型转换。您\xe2\x80\x99在本书中已经看到了其他类型的类型转换。要将 float > 值转换为 int,请将 (int) 放在浮点值之前,如下所示:

\n

aVal = (int)salary;

\n

类型转换中的 * 表示该类型转换是指针类型转换。\n malloc() 始终返回字符指针。如果您想使用\nmalloc() 分配整数、浮点或除字符之外的任何类型的数据\n,则必须对 malloc() 进行类型转换,以便接收分配的指针\n变量(例如 temps)接收\n正确的指针数据类型。temps 是一个整数指针;您不应该将临时值分配给 malloc()\xe2\x80\x99s 分配的内存,除非您将 nmalloc() 类型转换为整数指针。因此,前一个 malloc() 的左侧只是告诉 malloc() 一个整数指针,而不是默认的字符指针,将指向第一个分配的值。

\n
\n

温度:

\n
int * temps; /* Will point to the first heap value */\ntemps = (int *) malloc(10 * sizeof(int)); /* Yikes! */\n
Run Code Online (Sandbox Code Playgroud)\n

在阅读类似的线程后,据说malloc()返回一个 void 类型的指针,而不是字符类型的指针。我错过了什么吗?我知道不需要类型转换malloc()在 C 中进行类型转换。

\n

Joh*_*ode 5

在 1989 年标准之前,C 没有“通用”指针类型;指针类型不兼容,因此要将char *值分配给int *变量(反之亦然),您需要将值显式转换为目标类型。

\n

此外,在 1989 年标准之前,所有内存分配函数 ( malloc/calloc/realloc) 都会返回char *,因此如果您将结果分配给不同的指针类型,则必须使用强制转换:

\n
int *ptr = (int *) malloc( some_size );\n
Run Code Online (Sandbox Code Playgroud)\n

坦率地说,这真是令人痛苦。人们认识到 C 可以使用某种“通用”指针类型,因此引入了该类型,以及无需强制转换即可将值转换为其他指针类型(反之亦然)的void *规则。void *内存分配函数更改为返回void *,因此不再需要强制转换:

\n
int *ptr = malloc( some_size );\n
Run Code Online (Sandbox Code Playgroud)\n

您不能取消引用 a void *- 结果将是一个void没有值和大小的类型。出于同样的原因,您可以\xe2\x80\x99t 进行指针算术或在 a 上使用下标运算符void *.

\n