一、典例导入
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";
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) = ____;
二、地址空间
三、逐个解析
3.1 选择题
globalVar在哪里?数据段 C
staticGlobalVar在哪里?数据段 C
staticVar在哪里?数据段 C
- 全局变量(包括被
static
修饰的):无论是否使用static
修饰,全局变量都存储在数据段。不过,static
关键字限制了全局变量的可见性,仅在声明它的文件内可见。这意味着,尽管静态全局变量在数据段中,但它们不能被程序中其他文件直接访问。- 已初始化的静态全局变量:存储在数据段的
.data
部分。- 未初始化或初始化为零的静态全局变量:为了节省空间,通常存储在
.bss
部分,该部分在程序启动时被清零。
localVar在哪里?栈区 A
- 局部变量(被
static
修饰):这些变量虽然在其所在函数的作用域外不可见,但由于static
修饰符的作用,它们实际上存储在数据段中,而不是通常存放局部变量的栈上。这样它们就能在函数调用之间保持状态,不会像其他自动存储期变量那样在函数调用结束时丢失值。- 局部变量(未被
static
修饰):存放在栈区。- 已初始化的静态局部变量:类似于静态全局变量,存储在
.data
部分。- 未初始化或初始化为零的静态局部变量:存储在
.bss
部分。
num1 在哪里? 栈区 A
num1是数组名,指的是整个数组,数组成员都是临时变量,存放在栈中。
char2在哪里? 栈区 A
char2 和 num1 的情况类似,虽然后面是一个字符串,存放在代码区,但是系统会在栈上开辟一段空间存放拷贝的 "abcd\0" ,char2 代表整个数组,存放在栈区:
*char2在哪里? 栈区 A
char2 指向的是数组的首元素,对 char2 解引用拿到的是数组的首元素,整个数组都存放在栈区中,故 *char2 也在栈区中:
pChar3在哪里? 栈区 A
pChar3 是指针,其指向代码段的常量字符串,但是它也是临时变量,存放在栈区中:
*pChar3在哪里? 代码区 D
pChar3 指向代码段的常量字符串,故对其解引用拿到的是常量字符串的首字符:
ptr1在哪里?栈区 A
ptr1 和 pChar3 类似,他们都是作为指针出现的临时变量,故存放在栈区。
*ptr1在哪里?堆区 B
ptr1 指向的是一块 malloc 的空间, malloc 的空间存放在堆区,故对其解引用拿到的是堆区的空间。
3.2 填空题
sizeof(num1) = ____; 40
int类型4byte,个数10,sizeof(nums1) = 4 * 10 = 40
sizeof(char2) = ____; 5
sizeof 统计时会统计 \0
strlen(char2) = ____; 4
strlen 统计时不会统计 \0
sizeof(pChar3) = ____; 4/8
pChar3 是指针,指针的大小在32位或64位机器上有差别,但一定是 4/8
strlen(pChar3) = ____;
pChar3 保存的是字符串
"abcd"
第一个字符'a'
的内存地址,故 strlen 为 4
sizeof(ptr1) = ____;
ptr1 是指针,同 pChar3