第一个问题为什么会是乱码:
你这个p[]的作用域是在char *GetMemory(void) {}之内的,也就是当它把p返回出去后,在它内部产生的"hello"(的内存区)被销毁(或被复盖),所以你再在main()里取p指向的内存空间时,这块内存已经不是原来的内容,就会出现乱码了。
第二问:因为你开了100个字符的内存,而只用了不到100个,最后又没显式地销毁它,当然就会“泄漏”
不知满意否
char *GetMemory(void)
{
char p[] = "hello world"; /*这里p是局部变量,函数返回就被释放了*/
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory(); /*str的内存空间已经释放了,其值不确定,因为可能会被修改*/
printf(str);
}
--
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);/*用malloc分配的内存一定要用free释放*/
}
但test调用GetMemory返回后,函数GetMemory申请的空间都被释放了,p变成了野指针了。
GetMemory返回的是一个指针,而下面是把返回的指针当成是数组用了。数组名是可以当指针用,但是Test中定义的str是一个指针,不是数组,所以怎么可以直接将str作为printf的参数呢?当然错了啊。
改成数组可能好点,不过用你这个思路不知道怎么解决了。。。
关注。。。