注意下面4个测试函数的运行结果:
测试函数1:
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);/* str拿不到GetMemory函数分配给p的空间(str = NULL;p = str;进入GetMemory函数后p = NULL;为p分配堆空间后str 仍为 NULL) */
strcpy(str, "hello world");
printf(str);
}
运行结果:
程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。
strcpy(str, "hello world");将使程序崩溃。
测试函数2:
char *GetMemory(void)
{
char p[] = "hello world";/* 局部变量的生存周期为其所在函数的执行周期,函数调用结束后会被释放,定义为静态或全局变量后则不会被释放 */
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf("%s", str);
}
运行结果:
可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,
但其原现的内容已经被清除,新内容不可知。
测试函数3:
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);/* 传入指针的地址才可获取GetMemory函数分配的空间(数据库中用的了此种方法),或者用return返回p,再用str接收 */
strcpy(str, "hello");
/* 用完分配的内存中的数据后,记得释放内存 */
printf("%s", str);
}
运行结果:
(1)能够输出hello(2)内存泄漏
测试函数4:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str); /* 用free释放后的内存,编译器不会把其中的数据清空(该内存没被再次使用前,仍可被使用),应手动清空:str = NULL; */
if(str != NULL)
{
strcpy(str, “world”);
printf("%s", str);
}
}
运行结果:
篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。
——以上内容摘自林锐《高质量C编程指南》