🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!
🌈hello!各位宝子们大家好啊,关于动态内存管理和 位段 等知识我们在前面一篇已经详细介绍了? ⛳️今天就来看看这些经典的笔试题你会做吗?而这需要一些基本的C/C++程序内存分配的几个区域这些知识,今天就给大家一起讲一讲! 📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!
🔥 注:本笔试题出自《高质量的C/C++编程》林锐博士这本书 《高质量的C/C++编程》《动态内存管理》《位段 联合 枚举》
⛳️大家在学习C语言的过程中不知道思没思考过这个问题!我们每次创建的变量或者开辟的动态内存空间究竟是在内存中的那个位置开辟的呢?今天就给大家讲讲!
📑 C/C++程序内存分配的几个区域:
栈区(stack)
:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结
束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是
分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返
回地址等。堆区(heap)
:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分
配方式类似于链表。数据段
(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。代码段
:存放函数体(类成员函数和全局函数)的二进制代码。这些就是我们C/C++在运行中的大致内存区域不知道现在清楚了嘛?那么我们在来看这幅图相信大家就明白了
用通俗易懂的话来描述就是:
栈区(stack)
:存放的是我们平常创建的变量 形参 等 临时变量!堆区(heap)
:目前我们学的动态内存分配 都是在堆区开辟的!数据段
(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。代码段
: 可执行代码 和 只读 常量⛳️好了这些C/C++的内存分布我们懂了下面的经典笔试题就可以做一做了看一下你是否真的理解了
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
⁉️这里我们看的这个程序的意思大概就是,把我们的字符类型的指针变量传给
GetMemory
函数想利用它来为我们开辟空间并返回!
我们代码运行了,却是这样的结果!其实这个代码有3个问题
GetMemory
函数返回时 p 会销毁。导致内存泄漏char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
我们代码运行了,却是这样的结果!其实这个代码有3个问题
销毁
!void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
我们代码运行了,看上去结果没有问题!其实这个代码也有3个问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
我们代码运行了,看上去结果没有问题!其实这个代码也有3个问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Test(void)
{
char* str = (char*)malloc(100);
if (str == NULL)
{
perror("malloc");
return 1;
}
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
✅ 归纳:
好了以上就是关于C/C++的内存分布 和 动态内存管理的笔试题就全部讲解完毕啦!
C/C++程序的内存开辟
形参实参问题
返回栈空间地址问题
free为释放
free提前释放
☁️ 不知道大家今天的这套笔试题看懂多少呢?如果全部看懂了那么恭喜你已经毕业了
看到这里了还不给博主扣个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。