#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'
更新
我知道如何让它发挥作用,但我问为什么它不起作用。
答案 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);
}