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的内存是如何分配的? 展开
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的内存是如何分配的? 展开
4个回答
展开全部
第一点:一个由 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、栈区(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 编译器中,参数是由右往左入栈的,然后是函数
中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就
是主函数中的下一条指令,程序由该点继续运行。
第三点:关于变量的作用域:
变量类别 子类别
静态变量(离开函数,变量值仍保留)
局部变量 自动变量
寄存器变量
全局变量 静态变量(只能在本文件中用)
非静态变量(允许其他文件使用)
追问
谢谢!
展开全部
因为整个程序里只有一句int x;也就是只有一个声明x变量的语句。这样一来程序里使用的所有x都是同一个变量。只不过声明的时候你没有初始化而是在main函数里初始化为5,然后在cude函数里求3次方运算又返回给了x,这样毫无疑问的x的值就是5的3次方了。x的内存只有一个全局的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这些x都是指全局变量x,因为你这个程序里只定义了一个x。
定义局部变量x需要再函数内部 int x;
直接使用x不是定义。
全局变量存储在全局数据区,知道程序结束生命期在结束。
局部变量存储在堆栈区,生命期在函数被调用开始到函数执行结束。
定义局部变量x需要再函数内部 int x;
直接使用x不是定义。
全局变量存储在全局数据区,知道程序结束生命期在结束。
局部变量存储在堆栈区,生命期在函数被调用开始到函数执行结束。
更多追问追答
追问
谢谢!但是我刚才试了一下在函数里面再一次定义int x,然后编译的时候发生了错误,不知道是为什么呢?
追答
不会有问题啊,你是怎么写的?报了什么样的错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
它们都是同一个x,即定义的全局变量int x。这个x是全局通用的。
还有给你点建议,main()最好定义为int型,这是ANSI C++规定的。
还有给你点建议,main()最好定义为int型,这是ANSI C++规定的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询