目录
一、C和C++对内存的划分
二、小测试
【题目】
【答案】
【解释】
一、C和C++对内存的划分
1. 栈区 :存储非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 共享区:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。
3. 堆区 :用于程序运行时动态内存分配,堆是向上增长的。
4. 全局区(静态区) :也叫做数据段,存储全局数据和静态数据。
5. 代码段(常量区) :可执行的代码/只读常量。注意这里的常量指的是字面常量。
二、小测试
//观察如下代码,分析变量在内存中的位置
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.代码段(常量区)
globalVar在哪里?____ staticGlobalVar在哪里?____ staticVar在哪里?____
localVar在哪里?____ num1 在哪里?____ char2在哪里?____
*char2在哪里?____ pChar3在哪里?____ *pChar3在哪里?____
ptr1在哪里?____ *ptr1在哪里?____
2. 填空题:
sizeof(num1) = ____; sizeof(char2) = ____; strlen(char2) = ____;
sizeof(pChar3) = ____; strlen(pChar3) = ____; sizeof(ptr1) = ____;
【答案】
1. 选择题:
选项: A.栈 B.堆 C.全局区(静态区) D.代码段(常量区)
globalVar在哪里?_C_ staticGlobalVar在哪里?_C_ staticVar在哪里?_C_
localVar在哪里?_A_ num1 在哪里?_A_ char2在哪里?_A_
*char2在哪里?_A_ pChar3在哪里?_A_ *pChar3在哪里?_D_
ptr1在哪里?_A_ *ptr1在哪里?_B_
2. 填空题:
sizeof(num1) = _40_; sizeof(char2) = _5_; strlen(char2) = _4_;
sizeof(pChar3) = _4/8(32位下是4,64位下是8)_; strlen(pChar3) = _4_;
sizeof(ptr1) = _4/8_;
【解释】
- 如果数组是一个局部变量,那么这个数组被分配在栈上 如果这个数组是动态分配的(malloc出来的),那么这个数组被分配在堆上。
- 局部的指针变量(如题目中的pChar3、ptr1 2 3)也是局部变量,是局部变量就会存在栈上。但指针指向的内容(如*pChar3、*ptr1 2 3)不一定存在栈上。
- const不决定变量的存储位置:const关键字只是表示变量的值不能被修改,不会影响它的存储位置,常量区中的常量指的是数字1,2,3这种字面常量,所以题目中的pChar3依旧在栈区。
- 字面字符串(如"abcd")和数字1一样都是字面常量,是在(字面)常量区的。
- sizeof(数组名) 计算的是整个数组在内存中的大小(字节)。
- sizeof是运算符计算的是字符串在内存中的大小,会算上字符串中的'\0'。
- strlen是库函数计算的是字符串的长度,不会算上字符串中的'\0'。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。