C有关内存的思考题
2015-10-20 09:51
267 查看
void GetMemery(char *p){ p = (char *)malloc(100); } void Test(){ char *str = NULL; GetMemory(str); strcpy(str,"hello world"); printf(str); } int main(){ Test(); }
请问运行test函数会有什么样的结果?
下面是在windows下vs2013编译器的结果:程序崩溃
因为GetMemory方法并不能传递动态内存!test函数中的str一直都是null;strcpy将使程序崩溃
之所以不能传递动态内存,是因为在使用指针作为参数传递进另外一个函数的时候,如果在这个函数中修改了指针参数的地址,原来的指针还是不变的,因为在函数中调用另外一个函数并且将指针作为参数进行传递时,会将原来的指针复制一份,并且将这个副本当做实参传递进test函数,并且将其压进函数栈,在test函数中所进行的修改地址的操作只会修改指针副本的地址,对原来的指针是不会有影响的!正如一个经典的swap函数
swap(int *a,int *b){ int *temp = a; a = b; b = temp; }
如果用上面这段程序来对两个数进行交换的话,那么是不会成功的,注意我是用的一个指针类型的temp,相当于在swap函数中修改了a,b的地址,所以根据上面所说的原理,是不能交换两个数的,如果想要交换,那么将temp的类型改为int类型,而不是Int指针类型,就ok。
如果想要在函数体内修改指针的地址,不能直接修改指针的地址,而应该传入一个指针类型的引用或者指针的指针,两者都是二级指针,就像下面这段代码!
#include <stdio.h> #include <iostream> using namespace std; //直接在指针上分配动态内存,不可取,程序崩溃 void GetMemory(char *p){ p = (char *)malloc(100); } //使用指针类型的引用来作为参数进行传递,这样是可行的,输出helloworld void GetMemory2(char *&p){ p = (char*)malloc(100); } //使用指针的指针来进行参数的传递,这样也是可行的,输出helloworld void GetMemory3(char **p){ *p = (char*)malloc(100);//此处要直接给二级指针所指向的一级指针所指向的字符数组直接分配内存,因为我们需要的是在一级指针所指向的内存中复制helloworld进去 } void Test(){ char *str = NULL; //GetMemory(str); //GetMemory2(str); char **str2 = &str; GetMemory3(str2); strcpy(str,"hello world"); printf(str); } int main(){ Test(); }
相关文章推荐
- php数组相加 两个数组键名相同 后者不能覆盖前者
- mvc5 知识点01
- 胡玉洋《三分钟学会JUnit单元测试》
- 10795 - A Different Task
- YII 2 配置
- 工厂模式简单理解
- git 使用
- explicit关键字
- java调用C#的dll
- 【开源访谈】Countly 联合创始人&CEO Onur Alp Soner 访谈
- Android 广播大全 Intent Action 事件详解
- 客户端原生-话费充值功能的项目总结
- 延迟渲染的一些思考
- Android之android studio如何把项目分享到github并提修改的代码到Github
- maven项目转换成dynamic项目
- 将0,1,3,4,5,6等转化成0~1点,3点,4~6点
- c++自定义消息管理机制(类似cocos2d-x的实现方式)
- MFC里多文档多视图+多线程动态计算、绘制曲线
- NSMutableArray从plist文件中初始化
- maven项目转换成dynamic项目