对调用函数空间申请小结:

示例1:

void GetMemory(char *p)
{
  p
= (char *)malloc(100); } void fun() { char *str = NULL; GetMemory(str); strcpy(str, "udbfl"); TRACE("%s", str); }

结果分析:GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
  char *str = NULL;
  GetMemory( str );
  后的str仍然为NULL。

 

示例2:

char *GetMemory()
{
    char p[] = "udbfl";
    return p;
}

void fun()
{
    char *str = NULL;
    str = GetMemory();
    TRACE("%s", str);
}

结果分析:p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。str会得到是乱码。

示例3:

char* GetMemory()
{
    char *p = "udbful";
    return p;
}

void fun()
{
    char *str = NULL;
    str = GetMemory();
    TRACE("%s", str);
}

结果分析:

函数运行虽然不会出错,但是函数GetMemory的设计概念却是错误的。因为GetMemory内的"udbful"是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetMemory,它返回的始终是同一个“只读”的内存块。????

还有就是没有对str进行释放和赋空.

 

示例4:

void GetMemory3(char **p, int nNum)
{
    *p = (char*)malloc(nNum);
}

void fun()
{
    char *str = NULL;
     GetMemory3(&str, 100);
     strcpy(str, "udbful");
    TRACE("%s", str);
     free(str);
     str = NULL;
}

结果分析:这种正确,美中不足是的没有对申请空间的判断成功否。

示例5:

void fun(void)
{
char *str = (char*)malloc(100);
strcpy(str, "udbful");
free(str);
str = NULL;
}

结果分析:同4

posted on 2012-08-26 03:49  走出地平线  阅读(113)  评论(0)    收藏  举报