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";
	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(pChar) = ____;

先不要往下面看自己尝试着做一下,看能够做对几个,对自己学习检验。

知识点很多一定要细心看

1-3. globalvar在哪里 _C_   staticGlobalvar在哪里 _C_ staticvar在哪里 _C_ 考察点如下

通常考察的面试题:全局变量和static变量有什么区别?

全局变量,静态变量是放在数据段中(C语言的角度叫静态区),所以globalvar放在 C 中, staticGlobalvar放在C中, staticvar局部的静态变量也是属于静态变量所以也放在C中,   他们三个有共同点是整个程序运行期间都在 ,区别是全局变量globalvar,静态变量staticGlobalvar在main函数之前会初始化且作用域是全局的在哪都能使用,局部静态变量staticvar会在运行到main函数再初始化且作用域是在Test函数中只能在Test函数中使用。而globalvar和staticGlobalvar的区别在于链接属性不一样,globalvar是所有文件中可见,而staticGlobalvar只在当前文件可见

4-5. localvar在哪里 _A_   num1 在哪里 _A_

localvar是声明的局部变量所以存在A(栈)中的,num1是一个局部声明的数组所以也存在A(栈)中的

6-11, char2在哪里 _A_                      *char2在哪里 _A_                 pChar3在哪里 _A_  

          * pChar3在哪里 _D_                  ptr1在哪里 _A_                      * ptr1在哪里 _B_

char2是声明在栈上的字符数组放入abcd+'\0'开了5个字节,所以也存在A(栈)中的,*char2是取地址所以取得是首字符的地址,这个数组存在局部所以也存在A(栈)中的,pChar3是一个指针变量也是一个局部变量所以也存在A(栈)中的,* pChar3中pChar3存的是一个字符串常量的地址,* pChar3指向这个地址的内容,所以* pChar3在D(代码段)中。ptr1在哪里在哪里非常容易混淆,大家会看后面开辟了空间所以会以为在堆中,ptr1是int* ptr只是=前面声明的一个局部变量的指针,所以也存在A(栈)中的, 而* ptr1指向的内容才是开辟出来的,所以是在B(堆)中

总结:

全局变量,静态变量是放在数据段中的,声明的局部变量、字符、字符数组(char*)、取地址(*ptr)存在中的,取地址指向的地址是开辟出来的就在堆中,不然就存在代码段中,

2.填空题 :
sizeof(num1) = _40_;
sizeof(char2) = _5__;   strlen(char2) = _4__;
sizeof(pChar3) = _4、8__;   strlen(pChar) = _4___;  sizeof(ptr1)=___;

sizeof是计算字节数的

  1. sizeof(num1) 中num1[10] = { 1,2,3,4 };虽然只有4初始化,但是它开辟了10个整型所以是40个字节。
  2. sizeof(char2)中char char2[] = "abcd";是4个字节但是还有\0所以是5个字节。
  3. strlen(char2)中strlen是遇到\0结束所以是4个字节。
  4. sizeof(pChar3) 中char* pChar3 = "abcd";pChar3是一个指针,所以是4或8,区分32/64位。
  5. strlen(pChar)同样是遇到\0结束所以是4个字节。
  6. sizeof(ptr1)中int* ptr1 = (int*)malloc(sizeof(int) * 4);ptr1是一个指针,所以也是4或8,区分32/64位。

下面是图示说明:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我中意你呀丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值