【问题标题】:Understanding the output of this code in C language用 C 语言理解这段代码的输出
【发布时间】:2020-08-07 15:13:24
【问题描述】:
#include<stdio.h> 

void main()

{
    int a,b;
    char *cp;

    a=511;

    cp=&a;

    b=*cp;

    *cp=10;

    printf("%d %d %d",a,b,*cp);
}

它在 gcc 中发出 266 -1 10 警告:从不兼容的指针类型 'int *' [-Wincompatible-pointer-types] 分配给 'char *' cp=&a; 我知道 cp 是一个字符指针,所以它给了我一个警告。

我无法理解 a 和 b 的输出;

【问题讨论】:

  • 将 int 分配给 char 时的窄转换。这是一个不安全类型转换的例子。
  • 该输出表明您在 little-endian 系统上运行了代码。在大端系统上,输出会有所不同。这就是警告的原因。代码已损坏,应在运行前修复。
  • 如果你使用十六进制表示,你可能会得到更有趣和清晰的画面。
  • @user3386109:嗯,警告的原因是他从不兼容的指针类型'int *'分配给'char *'。即他需要一个演员表。该代码是不可移植的,而不是损坏的。好吧,它现在坏了,但如果他修好了,它就不能移动了:-)

标签: c output


【解决方案1】:

您得到的答案将取决于您的特定处理器如何存储整数。在 32 位“小端”机器上,它会将数字 511(十六进制为 1FF)存储在内存中的某处:

FF 01 00 00

从最低内存位置 (FF) 到最高 (00)。然后,您获取“a 的地址”并说“将其设为字符指针”并将其分配给“cp”。

除非您错过了“制作这个”部分,而 gcc 会为您执行此操作 - 这就是您收到警告的原因。要删除警告,您必须告诉 gcc:“是的,我想这样做”。您可以通过显式获取整数指针并将其转换为字符指针来做到这一点:

cp = (char *)&a;

好的。所以现在你有一个字符指针指向你存储 FF 的第一个地址。你取消引用它(使用 *cp)来获得一个 signed char。 this 的值是-1,你把它放在 b 中。

然后您将 FF 更改为 0A(十进制的 10)。内存现在看起来像这样:

0A 01 00 00

【讨论】:

    【解决方案2】:
        int a,b;
        char *cp;
    
        a=511;
    
        cp=&a;
    

    char 类型变量的范围是从[-128 to 127]int 的范围是[-32,768 to 32,767][-2,147,483,648 to 2,147,483,647]

    因此,当您将需要更多位的较大数据类型存储到需要较少位的较小数据类型中时,会导致窄转换,更恰当地称为不安全类型转换。

    尝试将值分配给a,它在char 的范围内,即[-127 to 128],那么您将获得可预测的输出,否则可能是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2021-03-01
      • 2011-02-21
      • 1970-01-01
      • 2011-06-01
      相关资源
      最近更新 更多