c++中两个局部变量和全局变量,变量名相同,请问内存空间如何分配?

#include<iostream>
using namespace std;
int x;
void cude(void)
{ x=x*x*x ;
}
void main (void)
{ x=5;
cude ( );
cout<<x<<endl;
}
上面这段程序输出的是125,在主函数调用cude时,为什么cude中的x也是5,这几个x的内存是如何分配的?

第一点:一个由 c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式
类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量
和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结
束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
例子程序:

//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0 在常量区,p3 在栈上。
static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得 10 和 20 字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0 放在常量区,编译器可能会将它与 p3 所指向的"123456"优化成一个
地方。

}

第二点:关于函数调用:

在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语
句)的地址,然后是函数的各个参数,在大多数的 C 编译器中,参数是由右往左入栈的,然后是函数

中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就
是主函数中的下一条指令,程序由该点继续运行。

第三点:关于变量的作用域:

变量类别 子类别

静态变量(离开函数,变量值仍保留)
局部变量 自动变量
寄存器变量

全局变量 静态变量(只能在本文件中用)
非静态变量(允许其他文件使用)追问

谢谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-17
因为整个程序里只有一句int x;也就是只有一个声明x变量的语句。这样一来程序里使用的所有x都是同一个变量。只不过声明的时候你没有初始化而是在main函数里初始化为5,然后在cude函数里求3次方运算又返回给了x,这样毫无疑问的x的值就是5的3次方了。x的内存只有一个全局的。本回答被提问者采纳
第2个回答  2013-07-17
这些x都是指全局变量x,因为你这个程序里只定义了一个x。
定义局部变量x需要再函数内部 int x;
直接使用x不是定义。

全局变量存储在全局数据区,知道程序结束生命期在结束。
局部变量存储在堆栈区,生命期在函数被调用开始到函数执行结束。追问

谢谢!但是我刚才试了一下在函数里面再一次定义int x,然后编译的时候发生了错误,不知道是为什么呢?

追答

不会有问题啊,你是怎么写的?报了什么样的错。

追问

#include
using namespace std;
int x;
void cude(void)
{
int x;
x=x*x*x ;
}
void main (void)
{ x=5;
cude ( );
cout<<x<<endl;
}
就是在cude里面加了一个int x,然后就不能运行了,下面也没有显示什么错误。。。

追答

不会有问题啊。整个编译只有一个warning,提示cude里面的x没有被初始化。
程序运行结果输出5

追问

哦,cude里面int x 没有初始化,给他赋一个初值就可以了。谢谢你!

第3个回答  2013-07-17
它们都是同一个x,即定义的全局变量int x。这个x是全局通用的。
还有给你点建议,main()最好定义为int型,这是ANSI C++规定的。
相似回答