【问题标题】:In the line: str = (char *) malloc(15); what does the (char *) mean?在该行中: str = (char *) malloc(15); (char *) 是什么意思?
【发布时间】:2014-08-16 03:42:12
【问题描述】:

我正在尝试学习 C 语言中的 malloc。我做过一些 java 编程,但想学习编码的具体细节。

让我解释一下我对此的了解,希望有人能填补空白。

行内:

str = (char *) malloc(15);

我知道我们在这里所做的是为这个字符串分配内存。 15个内存单元,我假设15个单元是15个字节,因为1个char占1个字节(是这样吗?)

令我困惑的是 (char *) 这是什么意思?我知道 * 是指针和取消引用运算符,但我不知道它在这种情况下的含义。

根据我有限的编程经验,我的第一个猜测是 (char *) 是显式转换。但我不确定。

如果之前有人问过这个问题,我深表歉意,但我已经搜索过了,我还搜索了 (char *) 和我在其他示例中看到的 (int *) 之类的变体,但似乎无法获得解释。

非常感谢任何帮助。

【问题讨论】:

标签: c string pointers


【解决方案1】:

这是一个演员表,将malloc 的输出转换为char *

不需要在 C 中从 malloc 转换返回值。

【讨论】:

  • 哪里有必要? C++?我一直在 C 语言的 malloc 教程上看到这样的演员表?
  • 这个世界上有很多人出于某种原因认为 C 和 C++ 是可以互换的,然后将类似的东西移植到不属于它的地方。
  • +1 用于解决将 malloc 的返回值转换为不必要的问题(如果不包含 stdlib.h 则很危险)
  • @DonShankin:在 C99+ 中这将是一个错误,但同意,没有一个熟悉 C 的人正在转换 malloc 的返回值。
  • @C_Student:转换malloc 结果的教程通常是非常古老的教程。此类教程的质量不再足够。它们已过时,应尽可能避免使用。
【解决方案2】:

Malloc 只是尝试为您分配一定数量的内存(以字节为单位),如果成功则返回指向该内存块开头的指针,如果失败则返回 NULL。在 C 中,char 始终是一个字节,这与您在 Java 中看到的不同。从malloc 返回的类型是void*(即没有类型)。转换为char* 只是使类型与您想要的匹配,但由于类型会自动为您转换,因此是多余的。实际上,您可能不想在 C 中进行显式转换,请参阅此答案以了解更多信息:https://stackoverflow.com/a/605858/296460

请注意,与 C 不同,C++ 中的void* 与其他指针类型不兼容,因此如果您不显式强制转换,则会出现错误。这是 C 和 C++ 不是兼容语言的情况的示例。问题中的代码示例似乎采用了 C++ 中的约定,然后在 C 中使用该约定,这是最好避免的。

【讨论】:

  • 短语“隐式转换”是矛盾的。 cast 是由括号中的类型名称组成的运算符;它总是明确的。转换运算符指定转换。转换可以是显式的(使用强制转换指定)或隐式的。
  • @KeithThompson,我对语言的草率选择进行了编辑。
【解决方案3】:

在 C 中,您不需要强制转换 malloc 的返回值。 malloc 返回的指向 void 的指针会自动转换为正确的类型。

str = (char *) malloc(15);

这只是强制转换,对于C,没有必要。但人们确实会投,因为 如果您希望您的代码使用 C++ 编译器进行编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多