码迷,mamicode.com
首页 > 其他好文 > 详细

GetMemory详解

时间:2014-09-29 04:06:27      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:getmemory详解

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的地址,*strNULL中的值为0

str传进去,str是一个指针,pstr的一个副本.str的内容copy到了pp指针申请了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的地址传进去 pstr地址的一个副本   

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.调用函数的过程中做

.申请一数组p[]并将其赋值为hello world(数组的空间大小为12)

.返回数组名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;

}

 

 


本文出自 “sunnyting” 博客,请务必保留此出处http://sunnyting.blog.51cto.com/8814143/1559153

GetMemory详解

标签:getmemory详解

原文地址:http://sunnyting.blog.51cto.com/8814143/1559153

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!