C++关于内存与参数传递的几道思考题
来源:互联网 发布:淘宝违法判刑大全 编辑:程序博客网 时间:2024/06/04 19:23
经典测试代码如下:
void GetMemory(char *p){p = (char *)malloc(100);}void Test(void)//1{char *str = NULL;GetMemory(str);strcpy(str,"hello world");printf(str);}char *GetMemory(void){char p[] = "hello world";return p;}void Test(void)//2{char *str = NULL;str = Getmemory();printf(str);}void GetMemory(char **p,int num)//3{*p = (char*)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str,100);strcpy(str,"hello world");printf(str);}void Test(void)//4{char *str = (char *)malloc(100);strcpy(str,"hello");free(str);if(str != NULL){strcpy(str,"world");printf(str);}}void Test(void)//5{ char a; char *str=&a; strcpy(str,"hello"); printf(str);}
运行1、2、3、4、5号Test函数后分别会有什么结果?
1、运行崩溃,因为GetMemory函数不能传递动态内存,Test中的str一直是NULL,strcpy(str,“hello world”)将使程序崩溃。
2、可能是乱码,因为GetMemory函数返回的是指向栈内存的指针,函数结束后,分配给它的栈空间被回收,该指针的值不是NULL,但其原有内容已经被清除,新内容不得而知。如果想返回一个指向在函数内部定义的变量的指针时,要把那个变量声明为static,这样可以保证该变量被保存在数据段中而不是栈中,该变量的生命期就和程序一样长。
3、能够输出”hello world”,但是Test函数没有对mallo开辟的内存进行释放,存在内存泄漏。
4、篡改动态内存区的内容,后果难以预料,非常危险。因为free(str)之后,str成为野指针,虽然指针还指着这个地址,但是这片内存已经不受str控制了,所以里边的内容不知什么时候就被改变了,是个不确定值。if(str != NULL)语句不起作用,不等于NULL的指针不一定就是有效指针,它也可能不再指向合法的内存块。free之后一定要给指针变量赋值NULL,以防止形成野指针。任何指针变量都要初始化NULL或者有效地址。
5、没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
0 0
- C++关于内存与参数传递的几道思考题
- C中一道关于内存的思考题
- C有关内存的思考题
- 关于指针参数的内存传递副本
- C语言 有关内存的思考题
- C C++有关内存的思考题
- C语言内存思考题
- 初学者的思考题(参数的传递方法)
- 关于C语言参数传递的新知
- C关于函数参数的传递
- 关于C语言传递参数的问题
- C++/C有关内存思考题
- 关于java中参数传递的几点疑惑
- 有关内存的思考题
- 有关内存的思考题
- 内存的思考题
- 有关内存的思考题
- 请教内存的思考题
- 如何构建高扩展性网站?
- 阿里巴巴2016双11背后的技术(不一样的技术创新)
- Zigbee实战
- ScrollView嵌套Tablaout与ViewPager联动(标签)(ScrollView与ViewPager冲突)
- .net 调用c++的类库clr
- C++关于内存与参数传递的几道思考题
- struts2中获取请求参数 笔记
- 剑指offer-面试题23-从上往下打印二叉树
- Node.js基础item1—Node.js概念
- stl常用算法_集合运算
- HDU/HDOJ 1181(并查集orDFS)
- 图解script的三种加载方式 异步加载顺序
- DOM解析XML实例
- Redis快速入门