【问题标题】:Output of pointer code指针代码输出
【发布时间】:2016-01-28 01:08:20
【问题描述】:

为什么下面C代码的输出是0.000000?

#include <stdio.h>

void foo(float *);

int main()
{
    int i = 10, *p = &i;
    foo(&i);
}

void foo(float *p)
{
    printf("%f\n", *p);
}

请解释你的答案。

【问题讨论】:

  • 你把你的类型弄混了......

标签: c pointers


【解决方案1】:

您正在让printf() 解释整数的位,就好像它们是浮点数的位一样。这是undefined behavior

你期待什么结果?

【讨论】:

  • 为什么没有类型转换。我预计 10.000000
  • @user2653926 这什么时候会发生? foo() 无法知道你在撒谎。但是,您应该收到编译器警告,因为您使用错误类型的参数调用 foo()
  • 抱歉还是没明白。
  • 首先将一个 int 发送到一个接受浮点数的函数中。你得到什么编译器警告/错误?始终尝试听听编译器对您的代码的评价。因此,将 i 的类型更改为浮动,您正在前往一个更好的地方......
【解决方案2】:

首先,当你的代码看起来像你的问题时,*p = &amp;i; 行根本不会做任何事情。

接下来 - 您将指向 int 变量的指针传递给需要 float 的函数。就像 cmets 中提到的 @unwind 一样,foo() 无法知道您在撒谎。 类型转换与您似乎认为的不同。

#include <stdio.h>
void foo(float *);
int main()
{
    int i = 10; //try this and see it fails, 
                //then switch this line with float i = 10; and try again
    foo(&i);
}
void foo(float *p)
{
    printf("%f\n", *p);
}

编辑>如果你坚持在某处进行类型转换......

#include <stdio.h>
void foo(float *);
int main()
{
    int i = 10;
    float p = (float)i;
    foo(&p);
    return 0;
}
void foo(float *p)
{
    printf("%f\n", *p);
}

【讨论】:

    【解决方案3】:

    C 和 C++ 中的Variadic functions 采用可变数量的参数,但它们不知道入口参数的类型。

    printf函数中,第一个参数是一个字符串,希望通过格式说明符指示后面参数的类型。

    在您的代码中,您的说明符指示以下参数是一个浮点数 (%f),但您传递了一个整数。由于所有这些类型检查都是在运行时进行的,而编译器对此一无所知,因此没有自动转换。

    您的代码调用未定义的行为。

    【讨论】:

    • 实际参数为静态类型float。它的运行时行为是由于严格的别名规则违规而定义的。但问题不在于可变参数函数调用。可以写float x = *p;,问题仍然存在。
    【解决方案4】:

    试试这个:

    #include <stdio.h>
    void foo(int *);
    int main()
    {
        int i = 10;
        foo(&i);
    }
    void foo(int *p)
    {
        printf("%f\n",(float) *p);
    }
    

    【讨论】:

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