#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'
UPDATE为什么下面这段代码失败
我知道如何使它工作,但我问为什么这是行不通的。
#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'
UPDATE为什么下面这段代码失败
我知道如何使它工作,但我问为什么这是行不通的。
实际上,你正在跳过编译器对古代C语法的支持。原始的C编译器允许没有类型的声明,默认为int。因此,任何功能之外,
foo;
将宣布一个全局变量int
称为foo
。所以,当你说
top = &a;
它声明了一个全局int变量称为top
,并试图用a
地址进行初始化。这给你两个你看到的错误 - 两个冲突的声明top
和无法将int *
转换为int
。当然,那些相同的古代C编译器不会给你第二个错误,愉快地将地址转换为int而不会抱怨。
这也告诉你为什么int i; i = 100;
作品---它的两个声明为i
作为全球int
变量这是确定的(这是确定的,因为它们是同一类型),第二个它初始化100
(只有一个声明有一个初始化)
有很多有趣的东西,在丹尼斯·里奇的The Development of the C Language
Chris Dodd有什么好的时机。 :) – birryree 2010-10-12 03:41:22
这工作:
#include <stdio.h>
int *top;
int a=1;
int main()
{
top=&a;
printf("%d\n",*top);
}
您需要确保不会做这样的全球分配。你只能做初始化,没有别的全局变量。
您也没有提及其他错误,请提及所有错误,有时一个错误是基于另一错误,当一个错误被修复时,其他错误得到修复。在这种情况下,它是:
'顶部'的冲突类型。
我对你得到的确切的错误信息有点惊讶,但问题(或者至少有一个明显的问题)是在函数之外,你可以定义和初始化变量,但你是而不是允许做一个正常的分配 - 这必须作为执行功能的一部分来完成。因此,您的top=&a;
是不允许的。
另一个问题是,你有main
返回void
,它应该返回int
(虽然大多数编译器会接受,甚至没有警告,更不用说错误消息)。
+1,编译器肯定有一些相当古怪的错误。 'clang'和'gcc'不会给这个问题提供非常准确的错误。 – birryree 2010-10-12 03:11:36
为什么不能'top =&a; '被视为初始化'顶部'? – justnobody 2010-10-12 03:16:45
为什么这样工作:'int i; i = 100;''main'外'' – justnobody 2010-10-12 03:18:11
老实说,我不知道为什么失败了,但这个工程:
#include <stdio.h>
int a = 1;
int* top = &a;
void main()
{
printf("%d\n", *top);
}
请记住:总是初始化POINTERS! 如果你不打算立即指派他们,至少做这样的事情:
int* top = 0;
另一种选择:
#include <stdio.h>
int a=1;
int *top=&a;
void main()
{
printf("%d\n",*top);
}
其实,从您的原始代码:
int *top;
int a=1;
top=&a;
正如其他人所说 - 在全球空间中,您可以声明或声明并初始化。你不能做任务。
top = &a;
这一行实际发生的是您实际上重新声明了名为top
的变量,并且它默认为int
类型。编译器应该实际发出警告,要创建一个名称为top
的新变量,该变量与以前声明的变量具有相同的名称,并生成一个额外的警告,表明您正在创建一个默认类型变量int
。
在C中,声明为不带类型的变量默认为int
,并且会产生您看到的错误。
错误C2440:初始化:不能从“诠释*”转换为“廉政”
什么,这是真正的抱怨是,top = &a;
在你的代码实际上看起来像int top = &a;
编译器,所以你试图绑定一个int*
到int
。
除非你实现定义'main'为返回'void'的一个扩展标准,可以调用未定义行为与此程序。任何事情都可能发生:快乐的代码失败,你必须问这个:) – pmg 2010-10-12 17:09:52