对调用函数空间申请小结:
示例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
浙公网安备 33010602011771号