2021-08-05 C语言内存分配问题

一、1、编写程序如下:

//下面程序会出现什么结果 
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

void getmemory(char *p)
{
    p=(char *)malloc(100);
    strcpy(p,"hello word");
 } 
 
 int main()
 {
     char *str=NULL;
     getmemory(str);
     printf("%s/n",str);
     free(str);
     return 0;
 }

2、运行,结果为:

 3、分析原因

 /*程序有问题,输出结果为null。修改(char *p)为(char **p)仍然不行。
网上的答案是:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。不理解。*/  

二、1、编写程序如下:

//问输出结果是什么?说说原因

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char **p,int num)
{
    *p=(char *)malloc(num);
}

int main()
{
    char *str=NULL;
    GetMemory(&str,100);
    strcpy(str,"hello");
    free(str);
    if(str!=NULL)
    {
        strcpy(str,"world");
    }
    printf("\n str is %s",str);
    return 0;
}

2、输出结果如下:(注意,return 0不能少,否则不出运行结果)

3、分析原因

网上分析原因如下:

free 只是释放的str指向的内存空间,它本身的值还是存在的.

所以free之后,有一个好的习惯就是将str=NULL.

此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,

尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。

这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。

当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jacklood

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

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

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

打赏作者

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

抵扣说明:

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

余额充值