0

我是 c 语言的新学生,我只是想出了这个。我编码:

    #include <stdio.h>
    main()
    {
       int i=100;
       printf("Helloo is: %d\n", i);  
    }

输出是:Helloo is: 100直到这里都很棒!如果我将代码更改为此

    #include <stdio.h>
    main()
    {
       int i=100;
       printf("Helloo is: %d\n", &i);  // the &i is the change
    }

当我编译它时,我收到一个警告:warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat].

好的,我收到了编译器的消息,但我很好奇,所以无论如何我运行程序并得到这个输出:Helloo is: -1078455636如果我再次运行程序,我会得到不同的输出!所以:

  • 所有这些数字是什么?变量 i 的内存地址?
  • 为什么每次我运行程序我都会得到不同的输出?

谢谢!

4

3 回答 3

1

&是地址运算符,&i是指向的指针int。因为每次运行程序时&i变量的地址都不一样,所以值会发生变化。i

此外,要打印指针地址,请使用%p以下void *类型:

int i=100;
printf("Helloo is: %d\p\n", (void *)&i);
于 2013-10-05T12:19:48.933 回答
1

所有这些数字是什么?变量的内存地址i

它们是将 ' 的地址重新解释i为整数的一种形式 - 一种未定义的行为:不允许传递地址代替整数。

为什么每次运行程序都会得到不同的输出?

变量的地址一直在变化,因此将地址重新解释为整数的代码一直在获取不同的数据。

如果要正确打印地址,请使用%p格式说明符,并将地址转换为void*

printf("Hello is: %p\n", (void*)&i);
于 2013-10-05T12:18:34.347 回答
1
printf("Helloo is: %d\n", &i);  // the &i is the change  

这是未定义的行为

您需要指定正确的格式说明符。

要打印您需要使用%p的地址,并且标准说 %p 需要 void * ,所以要强制转换。

printf("Helloo is: %p\n", (void *) &i); 
于 2013-10-05T12:23:24.540 回答