【问题标题】:Why is the output so?为什么输出会这样?
【发布时间】:2016-06-24 08:17:43
【问题描述】:

我知道 unsigned int* 和 int* 不兼容。但是由于 i,j 是 int* (int 指针),那么它们是如何使用无符号类型打印的。为什么输出为0!!

#include<stdio.h>
//#include<conio.h>
main()
{
  int *i,*j,**k;
  //i+2;
  k=&i;
  printf("\n*k=%u j=%u i=%u",*k,j,i);
  //getch();
}

输出:

*k=0 j=0 i=0

这是 295 个 C 问题中的问题之一,我只是想了解这段代码中发生了什么!这段代码不是我写的!

【问题讨论】:

  • 在未初始化时使用具有自动存储持续时间的对象的值的未定义行为,将错误类型传递给printf()的未定义行为。
  • 这里真正的问题是ij 都没有定义,因此*k 也没有定义。您所做的只是打印未定义的值。至于格式,你是对的,%u 应该传递一个unsigned int
  • 使用正确的格式说明符来打印指针。阅读此链接。可能对你有用..stackoverflow.com/questions/9053658/…

标签: c pointers int unsigned-integer


【解决方案1】:

正如 cmets 中所述,您在使用未初始化的变量时具有未定义的行为,因此可以打印任何内容(或者程序可能崩溃)。

因此,请务必在使用变量之前对其进行初始化。

您还应该使用 %p 打印指针值

int main()
{
    int *i,*j,**k;

    // Initialize i, j and k
    int x = 42;
    i = &x;
    j = &x;
    k=&i;

    // Use i, j and k
    printf("\n*k=%p j=%p i=%p",(void*)*k, (void*)j, (void*)i);

    return 0;
}

示例输出:

*k=0xbfd9eb8c j=0xbfd9eb8c i=0xbfd9eb8c

【讨论】:

    【解决方案2】:

    这些都没有任何意义。您正在声明但未初始化未定义行为的变量。

    最重要的是,您使用错误的格式说明符打印它们,这也是未定义的行为。

    为什么会这样输出?

    因为您滥用了该语言,因此任何事情都可能发生。它可能会因段错误而崩溃。它可以打印不同的垃圾值。都是未定义的。

    【讨论】:

    • 代码不是我写的,是295个C题之一。只是想讲道理!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2015-05-31
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    相关资源
    最近更新 更多