【问题标题】:C Syntax ExplanationC 语法说明
【发布时间】:2012-11-16 12:51:43
【问题描述】:

我正在学习 C 语言,我需要一些关于代码段的解释,

int *p;
p = (int *) malloc(sizeof(int));

(int *) 是什么意思,当你执行上面的代码时到底发生了什么?

【问题讨论】:

  • 您是否尝试在某个搜索引擎上进行搜索?
  • 这意味着你不应该这样做......
  • (int *) 表示写这篇文章的人不知道正确的 C。

标签: c


【解决方案1】:

(int *) 是一个所谓的 cast 运算符。用于将运算符右侧的值转换为括号内的类型。

这里用于将malloc()返回的void *指针转换为int *,即指向整数的指针。

这是一个非常糟糕的用法,you should not do it

【讨论】:

    【解决方案2】:

    试试这个链接man malloc

    在C语言中,malloc不需要类型转换所以直接写

    p = malloc(sizeof(int));

    仅供参考,这个(int *) 只不过是类型转换。由于许多函数返回void* 所以它需要在相应的类型中进行类型转换,以便进一步使用指针进行操作。

    如果是 malloc,它会被隐式处理

    (type) 在 C 中称为类型转换运算符。

    假设例如,

    int a;
    float b = 11.4;
    

    您想将b 的整数值放入a。使用类型转换

    a = (int)b

    【讨论】:

    • 没错,但我认为做隐式转换总是一件好事,你知道你在做什么。
    • “使用类型转换可以将任何类型转换为任何其他类型。”,关键字:type。它不会转换 ,除非标准如此说明(例如:对于数字类型)。
    • @YasassriChaturangeRatnayake:欲了解更多信息……请参阅stackoverflow.com/questions/4993327/…
    • @Joze 不,这几乎总是一件坏事。请查看stackoverflow.com/questions/4993327/…stackoverflow.com/questions/605845/… 的答案。在某些情况下投射可能是一个可以接受的妥协,但不是因为“你知道你在做什么”。一个证明通过不转换 malloc() 的结果知道自己在做什么。
    • 如果您还必须在 C++ 中使用您的代码,它对于兼容性非常有用。但我同意论点。感谢您提供信息。
    【解决方案3】:

    malloc 的返回类型为void*,它读作pointer-to-void,意思是指向某物的指针。

    p 的类型为 int*,因此是指向 int 的指针。为了将malloc 的结果分配给p,您需要以某种方式将int* 转换为void*

    如果你写:

    int* p = malloc(...)
    

    转换自动发生(“隐式转换”)。

    如果你出于某种原因决定写:

    int* p = (int*) malloc(...)
    

    结果相同,但转换是显式的(即“强制转换”)。

    【讨论】:

      【解决方案4】:

      Here's 关于 malloc 的文档。

      您正在分配一个 int 大小的内存块(此值可能会根据系统/编译器组合而改变)。

      (int *) 将右侧转换为 int *,这在 C 中不是必需的,您只需要 malloc。

      【讨论】:

        【解决方案5】:
        int *p;  // pointer to an integer
        p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer
        

        (int *) 部分称为类型转换,您是在告诉编译器:

        “我知道 malloc() 给了我一个 void *,但我要把它分配给别的东西”。

        类型转换有一些有用的理由,但它也可能很危险。在这种情况下,由于 malloc() 返回 void *,因此您不需要进行类型转换,因为它会自动安全地转换为其他指针类型。

        【讨论】:

          【解决方案6】:

          Unwind 已经给你答案了,但我想稍微扩展一下。

          在 C 中,有些类型是不兼容的;你不能直接将T 类型的值赋给Q 类型的变量;例如,您不能将指向 int 的指针分配给类型指针指向 double 的变量:

          double *q;
          int *p;
          ...  
          q = p; // will cause a diagnostic to be issued
          

          如果你真的需要做这个赋值,你可以使用 cast 表达式,它将值转换为目标类型:

          q = (double *) p;
          

          这告诉编译器将p 的值转换为指向double 的指针并将结果分配给q

          在 C 的原始 K&R 版本中,malloc 返回 char *,因此如果要将 malloc 的结果分配给不同类型的指针,则必须应用强制转换:

          int *p = (int *) malloc(SIZE);
          

          这种情况在 1989 年发生了变化,当时引入了第一个 C 标准。该版本引入了void * 类型来充当“通用”指针类型。 void * 类型的值可以直接分配给其他指针类型,而不需要强制转换。因此,从 C89 及更高版本开始,您可以简单地编写

          int *p = malloc(SIZE);
          

          这不仅更清洁,而且更安全;如果您忘记包含stdlib.h 或在范围内没有malloc 的声明,编译器将假定malloc 返回一个int 值并相应地生成代码。由于不能将 int 值直接分配给指针类型,因此您会得到诊断。但是,如果您添加演员表,该警告将被禁止,并且您可能会在运行时遇到问题。

          1999 年的标准摆脱了隐含的 int 假设,因此这不再是真正的危险,但放弃 malloc 调用仍然是一种更好的风格。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-22
            • 2018-01-02
            • 2013-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-23
            • 1970-01-01
            相关资源
            最近更新 更多