多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 题目一: ``` void GetMemory( char *p ) {  p = (char *) malloc( 100 ); } void Test( void ) {  char *str = NULL;  GetMemory( str );  strcpy( str, "hello world" );  printf( str ); } ``` 【运行错误】传入GetMemory(char\* p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值。执行完后的str仍然为NULL。编译器总是要为每个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改,这就是指针可以用作输出参数的原因。在本例中,**_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变**。所以GetMemory并不能输出任何东西。**事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。** ## 题目二: ``` char *GetMemory( void ) {  char p[] = "hello world";  return p; } void Test( void ) {  char *str = NULL;  str = GetMemory();  printf( str ); } ``` 【运行错误】GetMemory中的p是个数组,在{}里面定义是个局部变量,在函数返回后,内存已经被释放。这是很多程序员常犯的错误,其根源在于不理解变量的生存期。用调试器逐步跟踪Test,发现执行str=GetMemory语句后str不再是NULL指针,但是str的内容不是“hello world”,而是垃圾。 ## 题目三: ```  voidtest(void) {            char*s = 0x0;        s = getMem();        printf(s);  } 1.char* getMem(void) {            char*p = “hello world ”;        return p;  } ```  成功 helloworld字符串存放在常量区,这个地方存放的内容并不会在函数结束后销毁。   p最后依然指向这里