【发布时间】:2014-01-30 10:59:27
【问题描述】:
我正在学习 malloc 函数,我读到了这个:
ptr= malloc(sizeof(int)*N)
其中N 是您要创建的整数个数。
唯一的问题是 ptr 指向什么?编译器需要知道指针指向什么,以便它可以正确地进行指针运算。换句话说,如果编译器知道 ptr 是一个指向整数的指针,它只能将 ptr++ 或 ptr=ptr+1 解释为移动到下一个整数的指令。
只要您将变量 ptr 定义为指向您要使用的变量类型的指针,此方法就可以工作。
不幸的是,这引发了一个问题,即 malloc 如何知道指针变量的类型 - 不幸的是它不知道。
要解决此问题,您可以使用TYPE cast。这种 C 语言游戏是一种将值强制为特定类型的机制。您所要做的就是将 TYPE 说明符写在值之前的括号中,即:
ptr = (*int) malloc(sizeof(int)*N)
问题
-
我见过很多他们在 malloc 之前不使用
(*int)的地方,甚至在没有错误的情况下实现了一个链表。这是为什么呢? -
为什么指针需要知道除了它们指向的内存大小之外的任何东西?
【问题讨论】:
-
您完全,无可救药地将语法与语义混淆了,并且您误解了类型的必要性。除非您实际上对指针进行指针运算,否则编译器不需要知道它的确切类型。 (更是如此,因为
void *会受到与所有其他对象指针类型之间的隐式转换。)此外,类型转换不解决了问题。 -
请注意,如果您使用的是 Visual Studio,如果您不强制返回 malloc,它会报错。忽略它。
-
@Inisheer 那完全错了,抱歉。 MSVC 也有一个 C 编译器——你应该使用它来编译 C 代码。 永远不要使用 C++ 编译器编译 C 代码。 是的,每个 C++ 编译器都会报告错误,因为 C++ 的类型系统比 C 更严格。
-
@H2CO3 是的。无论您是否仅编译为 C。它会给出视觉提示,暗示没有强制转换的 malloc 是错误的。它不一定将所有可能在 C++ 中无效的 C 代码视为错误。 malloc 是浮现在脑海中的一个,并导致许多新的 C 开发人员重新使用 malloc。
标签: c pointers memory casting malloc