C语言内存思考题

C语言内存思考题

去企鹅面Python后台职位,悲剧的是一面笔试题除了一个正则,全部算法题,还要求得用C写。小白我4+年没有碰C了,知识早还给老师了,死了一地脑细胞。有个题随便蒙的,记录一下

看代码说出Test函数运行结果.

void GetMemory(char *p)
{
    p=(char*)malloc(100);
}

void Test(void)
{
    char *str=NULL;
    GetMemory(str);
    strcpy(str,"Hello world");
    printf(str);
}
用子函数申请动态内存成功,但是主函数得不到该内存,因为无法把内存首地址传递给主程序,子函数只是使用了一下主函数的指针值,并不能返回给主程序,运行strcpy一句时会程序崩溃。

void GetMemory(char **p,int num)//二级指针
{
    *p=(char*)malloc(num);
}

void Test(void)
{
    char *str=NULL;
    GetMemory(&str,100);//&str,取指针自身的地址
    strcpy(str,"hello");
    printf(str);
}
能够输出hello,内存泄漏。

char *GetMemory(void)
{
    char p[]="hello world";//此行将p[]改成*p就对了,此时p[]存在于栈里边,*p的话字符串存于常量区
    return p;
}

void Test(void)
{
    char *str=NULL;
    str=GetMemory();
    printf(str);
}
 可能是乱码。p[]是栈内指针,子函数调用结束时,它占用的栈内存就被释放了,主函数输出的是随机的内容.

void Test(void)
{
    char *str=(char*)malloc(100);
    strcpy(str,"hello");
    free(str);
    if(str!=NULL)
    {
        strcpy(str,"world");
        printf(str);
    }
}
通常会打印出world.小白我这本机实验,打印出world,啥事没有。

free(str)之后,str不是null,而是指向一块随机内存,也叫野指针。然后不明所以就往这块随机内存写值,后果也就呵呵了,非常危险。那为啥小白我这没出故障呢?找了一下,解释如下:

这是因为进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。

free之后一定要手动设置指针为null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值