您的位置:首页 > 其它

GetMemory详解

2014-09-28 19:49 77 查看
void GetMemory1(char *p)
{
p = (char*)malloc(100);
}
void Test1(void)
{
char *str = NULL;
GetMemory(str);
//把str传进去,str是一个指针
strcpy(str, "hello world");
printf(str);
}
char *GetMemory2(void)
{
char p[] = "hello world";
return p;
}
void Test2(void)
{
char *str = NULL;
str = GetMemory2();
printf(str);
}
void GetMemory3(char **p, int num)

{
*p = (char*)malloc(num);
}
void Test3(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
void GetMemory4(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test4(void)
{
char *str = NULL;
GetMemory4(&str, 100);
strcpy(str, "hello");
free(str);
str = NULL;
printf(str);
}
请问运行Test函数后会是什么样的结果?
NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0)。
把str传进去,str是一个指针,p是str的一个副本;.把str的内容copy到了p里;为p指针申请了100个空间。
p的值改变,但是str的值并没有改变。str的空间始终为NULL而并没有实际的空间,程序崩溃

认为 GetMemory(char *p)中的 p“就是” GetMemory(str)中的str。但p“不是”str,它只是“等于”str
就象: int a = 100;
int b = a; // 现在b等于a
b = 500; // 现在能认为a = 500
显然不能认为a = 500,因为b只是等于a,但不是a!当b改变的时候,a并不会改变,b就不等于a了。因此,虽然p已经有new的内存,但str仍然是null
改法一:双重指针
而双重指针为什么就可以了呢:把str的地址传进去 ,p是str地址的一个副本
p指向的值改变,也就是str的值改变。
改法二:返回值
char *GetMemory()
{
char *p=(char *)malloc(100);
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
strcpy(str,"hello world");
printf(str);
}
NO.2: 程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做:
1.申请一数组p[]并将其赋值为hello world(数组的空间大小为12),
2.返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.
其根源在于不理解变量的生存期;
NO.3:(1)能够输出hello (2)内存泄漏
NO.4: 申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.
应加上:str = NULL;
char *GetMemory5(void)
{
return "hello world";
}
void Test5(void)
{
char *str = NULL;
str = GetMemory3();
printf(str);
}
打印hello world,因为返回常量区,而且并没有被修改过
对内存操作的考查主要集中在:
(1)指针的理解;
(2)变量的生存期及作用范围;
(3)良好的动态内存申请和释放习惯。
swap( int* p1,int* p2 )
{
 int *p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:
swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  详解 GetMemory