内存问题

2025-12-17 13:42:18
推荐回答(3个)
回答1:

第一个问题为什么会是乱码:

你这个p[]的作用域是在char *GetMemory(void) {}之内的,也就是当它把p返回出去后,在它内部产生的"hello"(的内存区)被销毁(或被复盖),所以你再在main()里取p指向的内存空间时,这块内存已经不是原来的内容,就会出现乱码了。

第二问:因为你开了100个字符的内存,而只用了不到100个,最后又没显式地销毁它,当然就会“泄漏”

不知满意否

回答2:

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释放*/
}

回答3:

但test调用GetMemory返回后,函数GetMemory申请的空间都被释放了,p变成了野指针了。
GetMemory返回的是一个指针,而下面是把返回的指针当成是数组用了。数组名是可以当指针用,但是Test中定义的str是一个指针,不是数组,所以怎么可以直接将str作为printf的参数呢?当然错了啊。
改成数组可能好点,不过用你这个思路不知道怎么解决了。。。

关注。。。