【问题标题】:C Typecasting and malloc?C类型转换和malloc?
【发布时间】:2014-02-20 02:24:50
【问题描述】:

所以我了解类型转换的使用。使一种类型的变量充当另一种。但是每次我尝试这样做时,它都会打印出钻石哈哈?

    #include <stdio.h>
    #include <strings.h>
    #include <windows.h>

    void loginscreen(void)
    {
         printf("\nWelcome to the login screen...\n");
         int num = 4;
         printf("%c", (char)num);
         getchar();
    }

我还可以解释一下 malloc 以及它为什么以及如何使用类型转换。

【问题讨论】:

  • 这真的是两个问题......一个非常具体(将int 转换为char)和一个更广泛的(关于malloc)。为了将来帮助用户,请考虑更改您的问题的标题和标签以反映简单的选角问题。网络上有几个关于投射 malloc 的结果的资源。

标签: c casting malloc free


【解决方案1】:

您将号码 4 转换为 ASCII character 4,这恰好是 EOT(传输结束)。这是一个表示输入结束的特殊字符。在类 Unix 系统中,它可以通过按 Ctrl+D(在 Windows 中为 Ctrl+Z)来生成。由于这是一个不可打印的字符,您的终端可能会将其显示为“�”,即用于替换未知或无法表示的字符的替换字符。

解决你的另一个问题,malloc() 基本上要求系统给你一块内存。网络上有很多精彩的资源,您可以在其中找到非常好的解释。

【讨论】:

    【解决方案2】:

    强制转换(不是“类型转换”不会使一种类型的变量充当另一种类型的变量;它一种类型的值转换为另一种类型(或者可能转换为相同的类型)。

    (指针转换可用于将对象重新解释为不同类型的对象。您的代码不会这样做。)

    有些转换是隐式的;其他人是明确的。强制转换是由带括号的类型名称组成的运算符;它指定了显式转换。 (没有隐式强制转换这种东西。)

    在你的例子中:

    printf("%c", (char)num);\
    

    num 的值(int 类型)转换为char 类型。然后立即将其转换(提升)回类型int,因为当类型比int 窄的东西作为参数传递给像printf 这样的可变参数函数时,就会出现这种情况。如果没有演员表,它的行为方式完全相同:

    printf("%c\n", num);
    

    打印值为4的字符,恰好是不可打印的控制字符。

    您询问了malloc,但由于您的代码中没有调用malloc,这是(a) 一个单独的问题,并且(b) 它相当模糊。如果您对malloc 有更具体的问题,可以单独发布。但首先,我建议阅读comp.lang.c FAQ 的第 7 节,其中讨论了内存分配。 (特别是,您不应该转换 malloc 的结果;这是不必要的,并且在某些情况下可以掩盖错误。)

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 2014-01-30
      • 2015-08-05
      • 2017-04-16
      • 2016-05-22
      • 2023-03-30
      相关资源
      最近更新 更多