题目:这是一道关于内存的思考题,对以下代码的输出做出评价
1.
void GetMsg(char* msg){ strcpy(msg, "my world"); return ;}int main(){ char* pMsg = "hello world"; GetMsg(pMsg); printf("%s", pMsg); return 0;}
char* GetMsg1(){ char* pMsg = "my world"; return pMsg;}int main(){ char pMsgs = GetMsg1(); printf("%s", pMsgs); return 0;}
3.
void GetMsg2(char* msg){ msg = (char*)malloc(10); return ;}int main(){ char msg[] = "hello"; GetMsg2(msg); strcpy(msg, "hello world"); printf("%s", msg); free(msg); return 0;}
各位童鞋就大胆的猜吧(ps:不要用编译器,只能猜哦,答案在底下公布)
一、
首先,在GetMsg方法中,对msg指针变量进行拷贝赋值操作,嗯,理所当然,就这么通过了;可是,突然遇到了这样的提示:
内存读写冲突,那么问题来了,这是为什么呢?因为,没有分配内存!没有分配内存!没有分配内存!原因在于,形参不会自己分配内存。
二、
这个属于理想中正确输出的。
那么有童鞋会问了,内存开辟完就释放掉咯,不会留到外面,这个不应该是错的么?
原因是这样的,不管是在方法里面声明的是哪种类型的变量,方法都不会阻止你向外面传递数据,但是,你局部声明的变量会被清除掉,因为这里是大家知道的,局部变量的生命周期短,不会生存到外面;
ps:这里有个题外话,是关于引用变量的传递:
局部变量的引用 传出去了,在其他地方还是要引用这个局部变量,但是当这个方法结束之后,局部变量就被释放掉了,那传出去的引用就不知道要去引用谁了,当然就会报错了
三、
最后一题的重点在free上面,最后一个方法里面 对指针重新开辟内存,但是注意:是在局部开辟内存!!!说明这个内存只是在局部生效,那么问题来了,数组传进去的时候 退化成指针,方法结束之后,又变回了数组,为什么又会变成数组呢,因为还是局部操作不影响整体。那么最后free去释放的不是指针,是数组,是数组,是数组!free的规则是释放指针,在这里就会出现问题
最后:
答案:1.触发异常,内存读写冲突 2.my world 3.free 释放错误
ps:如有错误,欢迎指出,另外,还是建议大家在操作底层的时候有个良好的习惯,底层的东西错综复杂,一不小心就会酿成大错