c++中两个局部变量和全局变量,变量名相同,请问内存空间如何分配?
发布网友
发布时间:2022-04-22 17:31
我来回答
共4个回答
热心网友
时间:2023-11-13 23:28
第一点:一个由 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 编译器中,参数是由右往左入栈的,然后是函数
中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就
是主函数中的下一条指令,程序由该点继续运行。
第三点:关于变量的作用域:
变量类别 子类别
静态变量(离开函数,变量值仍保留)
局部变量 自动变量
寄存器变量
全局变量 静态变量(只能在本文件中用)
非静态变量(允许其他文件使用)追问谢谢!
热心网友
时间:2023-11-13 23:28
因为整个程序里只有一句int x;也就是只有一个声明x变量的语句。这样一来程序里使用的所有x都是同一个变量。只不过声明的时候你没有初始化而是在main函数里初始化为5,然后在cude函数里求3次方运算又返回给了x,这样毫无疑问的x的值就是5的3次方了。x的内存只有一个全局的。
热心网友
时间:2023-11-13 23:29
这些x都是指全局变量x,因为你这个程序里只定义了一个x。
定义局部变量x需要再函数内部 int x;
直接使用x不是定义。
全局变量存储在全局数据区,知道程序结束生命期在结束。
局部变量存储在堆栈区,生命期在函数被调用开始到函数执行结束。
热心网友
时间:2023-11-13 23:30
它们都是同一个x,即定义的全局变量int x。这个x是全局通用的。
还有给你点建议,main()最好定义为int型,这是ANSI C++规定的。