关于C指针的一个问题(获取内存)
2014-04-20 17:22
288 查看
void GetMemory(char* p,int num){ p = (char*)malloc(sizeof(char)*num); if(p == NULL){ exit(0); } } int main(){ char* str = NULL; GetMemory(str,10); strcpy(str, "OK?"); cout<<str<<endl; return 0; }
以上这个程序在GetMemory()函数你觉得可以实现对str的内存分配吗?
答案是:不可以。
这是有错误的,运行会出现段错误。
那么如何改正呢?
一种方法是,将创建的地址返回过去:
char* GetMemory1(int num){ char* p = (char*)malloc(sizeof(char)*num); if(p == NULL){ exit(0); } return p; }
这样就正确了。那么之前的为什么错了呢?
原来是传指针的问题,char* p 的p接收到的是str的值,str原来是指向NULL的,即str == NULL,传过去之后,p的值也是NULL了,
即p=NULL了,因为p是指针,p=NULL就意味着,p指向的是NULL。
而我们知道每个指针在内存都会有空间来存放它的值的,char* p,的含义代表着,在GetMemory()里,创建了一个p指针,指针指向了str指向的区域。
相当于我们将char*看成是一个类型,那么其就是按值传递的,所以我们在GetMemory()里给其开辟了一块空间,然后将其指向该空间的首地址,
那么结果是意味着p的空间里存放的值变了,变成了开辟的空间的首地址了,即没有指向NULL了,但是此时str还是指向NULL的,
也就是说它没有起到将str指向开辟的空间的首地址的作用。
那么我们如何在原函数上改正确它,不用返回首地址,用void呢?
void GetMemory(char** p,int num){ *p = (char*)malloc(sizeof(char)*num); if(*p == NULL){ exit(0); } }
这样就可以了,char** p,代表着p是指向指针的指针,我们将str在内存的空间地址的值传给p即可,
此时我们将分配的内存空间的首地址,通过*p存放到内存中用来存放str的值的空间里面,
因为p是指向str地址的指针,所以*p就代表str在内存中的地址,所以这个办法是可行的
还有一个简单的办法就是引用:
void GetMemory(char* &p,int num){ p = (char*)malloc(sizeof(char)*num); if(p == NULL){ exit(0); } }引用的效果就是在函数里可以改变原来的元素的值,所以引用可以解决。
另附带一个简单的题:
int& func(){ int a = 3; return a; } int main(){ int a = func(); cout<<a<<endl; return 0; }
如果不运行你觉得这段代码输出结果是什么?
这样做是正确的吗?
输出是3,。
我们知道在func()里面a=3,指向完func()后,局部变量就抛弃了,但是我们把引用传回来了,因此我们主函数的a指向了,我们刚抛弃的内存空间的一块区域,
那个区域的值我们刚刚赋值过了,是3,所以我们输出的是3.
但是这样是不正确的,因为那块区域的值,我们是可以通过其它方式更改的,或者系统再把它分配出去,那么主函数的a的值就会跟着改变,
如果之后我们不在更改a的内存空间地址,那么之后的a我们看到它的值都将是不稳定的,不确定的,因此这样做是不正确的。
相关文章推荐
- 前两天困扰我的一个关于指针和内存的问题的总结
- 关于指针和数组对申请内存malloc和作为参数传递的一些问题
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 关于多指针指向同一块内存的问题!
- 关于指向结构体的指针——又一个指针用法中容易忽略的问题
- 关于指针和内存的几个问题
- 关于在$.ajax函数中无法获取$(this)指针的问题
- 问一个关于指针的小问题
- 关于栈内存溢出的一个问题
- 关于继承类的指针指向基类的内存的问题
- 关于指针与类的内存分布问题(问题思考来自《程序员面试宝典》)
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- 一个关于指针间赋值及间接求值的问题
- 关于一个CS项目,jvm内存溢出问题的解决方案
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- <项目一>请教一个关于获取post json数据的问题
- 关于指针和内存的几个问题
- 关于jboss 5.0.0 上配置数据源要注意的一个问题 Java获取JBOSS数据源
- 关于一个指针问题的困惑
- 一个关于二维指针的问题