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