为什么以下代码失败

时间:2010-10-12 03:00:40

标签: c

#include <stdio.h>

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

void main()
{
    printf("%d\n",*top);
}
error C2440: 'initializing' : cannot convert from 'int *' to 'int'

更新

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

6 个答案:

答案 0 :(得分:6)

你实际上是在嘲笑编译器对古老C语法的支持。原始C编译器允许没有类型的声明,将其默认为int。所以在任何函数之外,

foo;

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

top = &a;

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

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

Dennis Ritchie的The Development of the C Language

中有许多令人着迷的东西

答案 1 :(得分:4)

我对你得到的确切错误信息感到有些惊讶,但问题(或至少有一个明显的问题)是在函数之外,你可以定义和初始化变量,但是你允许进行正常的分配 - 必须在执行函数时完成。因此,我们不允许top=&a;

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

答案 2 :(得分:3)

实际上,从原始代码:

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

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

top = &a;中实际发生的是您实际上正在重新声明一个名为top的变量,它默认为int类型。编译器实际上应警告创建一个名为top的新变量,该变量与先前声明的变量具有相同的名称,并生成另一个警告,表明您正在创建默认类型int的变量。

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

  

错误C2440:'初始化':无法从'int *'转换为'int'

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

答案 3 :(得分:1)

这有效:

#include <stdio.h>

int *top;
int a=1;
int main()
{
    top=&a;
    printf("%d\n",*top);
}

你需要确保不要做那样的全局分配。你只能进行初始化,而不是全局变量。

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

  

'top'的冲突类型。

答案 4 :(得分:0)

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

#include <stdio.h>

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

void main()
{
    printf("%d\n", *top);
}

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

int* top = 0;

答案 5 :(得分:0)

另一种选择:

#include <stdio.h>

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

void main()
{
    printf("%d\n",*top);
}