动态内存开辟

动态内存开辟

1.动态内存开辟相关试题

题目1:

void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}

解释:这里在Test函数中,只是将str指针本身传过去了,在Getmemory函数中,对形参p进行修改并不会影响到Test函数中str

变量的值。出了Germemory函数str的值还是NULL,此时srtcpy函数对str这个空指针进行操作就是不合法的操作,导致程序错误。

题目二:

char *GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char *str = NULL;
    str = GetMemory();
    printf(str);
}

解释:在Getmemory函数中开辟的空间是在栈区上开辟的,当Getmemory函数运行结束时,p所指向的内存空间就已经还给操作系统了,并且被赋值为了随机值。所以在Test函数中打印str指向的空间时,打印出的应该是一串乱码。

题目三:

void GetMemory(char **p, int num)
{
    *p = (char *)malloc(num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
}

解释:这段代码不细看是没有什么问题的,在Test函数中的printf函数执行结束之后,str仍然指向堆空间中的内存。在程序结束之前应该主动将其释放。

题目四:

void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    if(str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
}

解释:在free释放了堆中开辟的空间时,应该及时的将free的参数设置为NULL。这里假如代码的第五行执行完毕之后,将str设置为了空指针,就不会出现后续的错误了。

2.c/c++程序中的内存开辟

内存图如图所示。

栈区向下增长,堆区向上增长。栈区和堆区之间是内存映射段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtOSmndW-1692594009377)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230821125043573.png)]

c/c++程序内存分配的几个区域:

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的二进制代码。

有了这些知识,就可以理解之前为什么加了static的局部变量可以全局使用了:

局部变量实际上是在内存中的栈区开辟空间的, 栈区上的变量的特点就是出了作用域之后,就被销毁。但是被static修饰的变量是存储在数据段的,会一直持续到程序结束才会被销毁,所以被static修饰的局部变量的生命周期变长了。

3.完结

动态内存开辟的全部内容就到这里啦,若有不足,欢迎评论区指正,下期见!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这里是彪彪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值