2010-10-12 62 views
2
#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为什么下面这段代码失败

我知道如何使它工作,但我问为什么这是行不通的。

+1

除非你实现定义'main'为返回'void'的一个扩展标准,可以调用未定义行为与此程序。任何事情都可能发生:快乐的代码失败,你必须问这个:) – pmg 2010-10-12 17:09:52

回答

6

实际上,你正在跳过编译器对古代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

+0

Chris Dodd有什么好的时机。 :) – birryree 2010-10-12 03:41:22

1

这工作:

#include <stdio.h> 

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

您需要确保不会做这样的全球分配。你只能做初始化,没有别的全局变量。

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

'顶部'的冲突类型。

4

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

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

+0

+1,编译器肯定有一些相当古怪的错误。 'clang'和'gcc'不会给这个问题提供非常准确的错误。 – birryree 2010-10-12 03:11:36

+0

为什么不能'top =&a; '被视为初始化'顶部'? – justnobody 2010-10-12 03:16:45

+0

为什么这样工作:'int i; i = 100;''main'外'' – justnobody 2010-10-12 03:18:11

0

老实说,我不知道为什么失败了,但这个工程:

#include <stdio.h> 

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

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

请记住:总是初始化POINTERS! 如果你不打算立即指派他们,至少做这样的事情:

int* top = 0; 
0

另一种选择:

#include <stdio.h> 

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

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

其实,从您的原始代码:

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

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

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

在C中,声明为不带类型的变量默认为int,并且会产生您看到的错误。

错误C2440:初始化:不能从“诠释*”转换为“廉政”

什么,这是真正的抱怨是,top = &a;在你的代码实际上看起来像int top = &a;编译器,所以你试图绑定一个int*int