韦老师昨天晚上讲解的函数传参还有点疑惑,我单步调试了代码,我认为应该free(&str),请问对吗?为什么?
void GetMemory(char **p,int num)
{
*p = malloc(num);//
}
main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
free(&str);//free(str);
if(str!=NULL)
{
printf("%X/n", str);
}
}
然后我也单步调试了free(str),free的只是申请内存首地址的值前4个字节。
引申问题:
如果我知道程序中某个位置调用了“malloc(10)”,并且知道他的返回值为:0x2000000C。
我在其他的代码中,free(0x2000000C),是不是就可以释放这个内存?
那么malloc和free是如何记住这个申请的首地址的位置和大小的?
- 问:如果我知道程序中某个位置调用了“malloc(10)”,并且知道他的返回值为:0x2000000C。
我在其他的代码中,free(0x2000000C),是不是就可以释放这个内存?
答:是的,不过一般 malloc 出的地址不是固定值;所以使用指针的方式来释放。
- 问:认为应该free(&str),请问对吗?
答:不对,free 的参数是一个 malloc 出的指针,以下代码应该好理解吧。
main()
{
char *str = NULL;
str = malloc(100);
strcpy(str, "hello");
free(str);
}
- 问:malloc和free是如何记住这个申请的首地址的位置和大小的?
答:一般使用链表来记录,不同系统的具体实现方法不一样。
感谢老师,追问:
1)如果是我问题中的代码,我该如何free呢?还是说这种用法是错误的,没办法free?
2)malloc free 一般是用链表来记录:就咱们学习的stm32来说,这个是谁来记录的呢,单片机有内置功能吗?还是说要自己写成代码完成这个功能?