C/C++中的变量定义与声明

来源:百度知道 编辑:UC知道 时间:2024/05/05 19:08:45
C/C++中的变量定义与声明;

上网查阅资料,发现所谓变量声明,仅仅是告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存,而定义就是分配了内存。

举例:

int main()
{
int a;
a=2;
return 0;
}

上述程序在执行完第一句(int a;)后,不知是否为变量a分配了内存?
如果是,那么int a;这句即为a变量的定义;
如果不是,那么int a;这句只能叫做a变量的声明.

查阅资料;
发现对于这个问题,有2种说法;
---
第一种认为:
对于第一行代码(int a;),编译器不会做任何事,它不会为它在栈中分配一点东西,直到第2句(a=2;),编译器才会将其压入栈中。如果反汇编,看到的代码可能是这样的:
push 1;
当然,并不一定编译器就会这样做,也有可能在声明int a时,编译器就会把一个废值入栈,到a=2;这一句再为其赋值,这要看编译器的具体取舍.

第二种认为:
int a;这句会分配内存空间,只是这部分内存空间里存放的是随机值,直到在a=2;这句被赋予新值.

那么,事实是怎样的呢?

1、变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

2、声明用于向程序表明变量的类型和名字,定义包括声明:当定义变量时声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型前的关键字extern。

对于局部变量来说它即是声明也是定义而对于类或方法则有所不同,我曾经在多本英语书上写(看)过。现在我还没有达到了解底层的阶段不知道编译器是怎么做的,我想应该跟编译器也有关系吧呵呵

我支持 ivanniren的说法!~ 有能力是要多了了解一些底层的东西对自己是有帮助的。

int main()
{
int a;
void *p=&a;
printf("p=%x\n",p); // 警告性错误
a=2;
printf("%d",a);
getchar();
return 0;
}
可以看出,a定义的时候已经分配了空间,经过断点调试可以看到a在没赋值之前是一个随机数,并不允许访问(包括用指针间接访问)。以上是经过VS 2005调试过的。

第一句既是声明也是定义,分配了内存空间,但是内部的值是不可预知的
可以获得&a的值

编译器相关的问题,标准上应该是声名不分配空间的。

我觉得吧,不用在这种问题上纠缠,只要记得在声明变量时别忘了初始化就对了.

同编译器有关,不同的编译器处理方法可能不同。

VC++
int a; 局部量,分配了单元,但没有给初值。
如果:
int main()
{
int a;
printf("%d",a); // 警告性错误
a=2;
return 0;
}
编译时得警告错误信息,说“用了未初始化的局部量”
------------------