【问题标题】:Why this code below fails为什么下面的代码失败
【发布时间】:2010-10-12 03:00:39
【问题描述】:
#include <stdio.h>

int *top;
int a=1;
top=&a;

void main()
{
    printf("%d\n",*top);
}
错误 C2440:“正在初始化”:无法从“int *”转换为“int”

更新

我知道如何让它工作,但我问为什么它不起作用。

【问题讨论】:

  • 除非您的实现将main 定义为返回void 作为标准的扩展,否则您可以使用此程序调用未定义行为。任何事情都有可能发生:很高兴代码失败了,你必须问这个问题:)

标签: c


【解决方案1】:

您实际上是在绊倒编译器对古老 C 语法的支持。最初的 C 编译器允许没有类型的声明,默认为 int。所以在任何功能之外,

foo;

将声明一个名为foo 的全局int 变量。所以当你说

top = &a;

它声明了一个名为top 的全局int 变量,并尝试使用a 的地址对其进行初始化。这给了您看到的两个错误——top 的两个冲突声明以及无法将int * 转换为int。当然,那些同样古老的 C 编译器不会给你第二个错误,很乐意将地址转换为 int 而不抱怨。

这也告诉你为什么 int i; i = 100; 有效 --- 它的两个声明 i 作为全局 int 变量(这没关系,因为它们是相同的类型),第二个将它初始化为 @ 987654334@(没关系,因为只有一个声明有初始化器)

Dennis Ritchie 的The Development of the C Language 中有很多有趣的东西

【讨论】:

    【解决方案2】:

    我对您收到的确切错误消息感到有些惊讶,但问题(或至少一个明显的问题)是在函数之外,您可以定义和初始化变量,但是你被允许做一个正常的分配——这必须作为执行函数的一部分来完成。因此,您的top=&amp;a; 是不允许的。

    另一个问题是你有main 返回void,它应该返回一个int(尽管大多数编译器会接受它甚至没有警告,更不用说错误消息了)。

    【讨论】:

    • +1,编译器肯定有一些相当奇怪的错误。 clanggcc 没有给出非常准确的错误。
    • 为什么top=&amp;a; 不能算是为top初始化?
    • @justnobody 进一步查看我的或 Chris Dodd 的答案,以解释为什么该代码有效。您实际上是两次声明了一个名为 i 的变量,只是第二个变量具有隐式的默认类型 int
    【解决方案3】:

    其实,从你原来的代码来看:

    int *top;
    int a=1;
    top=&a;
    

    正如其他人所提到的 - 在全局空间中,您可以声明、声明和初始化。你不能做作业。

    top = &amp;a; 行中实际发生的情况是,您实际上是在重新声明一个名为 top 的变量,并且它默认为 int 类型。编译器实际上应该警告创建一个名为 top 的新变量,它与先前声明的变量同名,并生成一个附加警告,说明您正在创建一个默认类型的变量 int

    在 C 中,没有类型声明的变量默认为 int,这会产生您看到的错误。

    错误 C2440:“正在初始化”:无法从“int *”转换为“int”

    真正抱怨的是,您的代码中的top = &amp;a; 在编译器中实际上看起来像int top = &amp;a;,因此您正在尝试将int* 绑定到int

    【讨论】:

      【解决方案4】:

      这行得通:

      #include <stdio.h>
      
      int *top;
      int a=1;
      int main()
      {
          top=&a;
          printf("%d\n",*top);
      }
      

      您需要确保不要进行这样的全局分配。全局变量只能初始化,不能做别的。

      您也没有提到其他错误,请提及所有错误,有时一个错误是基于另一个错误,当一个错误被修复时,其他错误得到修复。在这种情况下是:

      'top' 的类型冲突。

      【讨论】:

        【解决方案5】:

        另一种选择:

        #include <stdio.h>
        
        int a=1;
        int *top=&a;
        
        void main()
        {
            printf("%d\n",*top);
        }
        

        【讨论】:

          【解决方案6】:

          老实说,我不知道为什么会失败,但这有效:

          #include <stdio.h>
          
          int a = 1;
          int* top = &a;
          
          void main()
          {
              printf("%d\n", *top);
          }
          

          请记住:始终初始化您的指针! 如果你不打算立即分配它们,至少做这样的事情:

          int* top = 0;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-27
            • 1970-01-01
            • 2022-01-21
            • 1970-01-01
            相关资源
            最近更新 更多