C/C++内存区域划分:
变量所在哪个内存区域以及变量所占空间大小是多少?
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}
问题一:
1. 选择题:
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
题目:
1.globalVar在哪里?____ 2.staticGlobalVar在哪里?____
3.staticVar在哪里?____4.localVar在哪里?____5.num1 在哪里?____ 6.char2在哪里?____
7.*char2在哪里?___ 8.pChar3在哪里?____9.*pChar3在哪里?____ 10.ptr1在哪里?____
11.*ptr1在哪里?____
问题二:
2. 填空题:
1.sizeof(num1) = ____; 2.sizeof(char2) = ____; 3.strlen(char2) = ____;
4.sizeof(pChar3) = ____; 5.strlen(pChar3) = ____;
6.sizeof(ptr1) = ____;
答案:
问题一:
C C C A A A A A D A B
问题二:
40 5 4 4 4 4
解析:
问题一:
1.globvar是全局变量所以在数据段 C
2.staticGlobalVar 是静态全局部变量在静态区 C
3.staticvar是静态局部变量在栈区 C
4.localVar是局部变量在栈区 A
5.num1是局部变量在栈区 A
6.char2 是局部变量在栈区 A
7.*char2 是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2在栈上A
8.pChar3是局部变量在栈区 A
9.*pChar3得到的是字符串常量字符在代码段 D
10.ptr1是局部变量在栈区A
11.*ptr1是malloc申请的空间数据,在堆上 B
问题二:
1.一个整型占4个字节,num1的大小为10,所以有4*10个字节
2.char2 字符数组,要包含‘\0’,所以是5
3.strlen不包含‘\0’,所以是4
4.pchar3是指针,所以为4
5.strlen不计‘\0’,所以是4
6.ptr1是指针,所以是4
备注:
1.栈:又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
3. 堆:用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段:存储全局数据和静态数据。
5. 代码段:可执行的代码/只读常量