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

#include<iostream>usingnamespacestd;intx;voidcude(void){x=x*x*x;}voidmain(void){x=5;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的内存是如何分配的?
展开
 我来答
maying_07
2013-07-17 · 超过12用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:27.3万
展开全部
第一点:一个由 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 编译器中,参数是由右往左入栈的,然后是函数

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

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

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

变量类别 子类别

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

全局变量 静态变量(只能在本文件中用)
非静态变量(允许其他文件使用)
追问
谢谢!
小兆86
2013-07-17 · TA获得超过802个赞
知道小有建树答主
回答量:990
采纳率:25%
帮助的人:870万
展开全部
因为整个程序里只有一句int x;也就是只有一个声明x变量的语句。这样一来程序里使用的所有x都是同一个变量。只不过声明的时候你没有初始化而是在main函数里初始化为5,然后在cude函数里求3次方运算又返回给了x,这样毫无疑问的x的值就是5的3次方了。x的内存只有一个全局的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
玻璃麦田bd
2013-07-17 · TA获得超过451个赞
知道小有建树答主
回答量:249
采纳率:0%
帮助的人:274万
展开全部
这些x都是指全局变量x,因为你这个程序里只定义了一个x。
定义局部变量x需要再函数内部 int x;
直接使用x不是定义。

全局变量存储在全局数据区,知道程序结束生命期在结束。
局部变量存储在堆栈区,生命期在函数被调用开始到函数执行结束。
更多追问追答
追问
谢谢!但是我刚才试了一下在函数里面再一次定义int x,然后编译的时候发生了错误,不知道是为什么呢?
追答
不会有问题啊,你是怎么写的?报了什么样的错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
盗墓者fgh
2013-07-17 · 超过11用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:29.5万
展开全部
它们都是同一个x,即定义的全局变量int x。这个x是全局通用的。
还有给你点建议,main()最好定义为int型,这是ANSI C++规定的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式