【C语言问题搜集贴】【提问:malloc、free、引用、指针】

韦老师昨天晚上讲解的函数传参还有点疑惑,我单步调试了代码,我认为应该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是如何记住这个申请的首地址的位置和大小的?

image

  1. 问:如果我知道程序中某个位置调用了“malloc(10)”,并且知道他的返回值为:0x2000000C。
    我在其他的代码中,free(0x2000000C),是不是就可以释放这个内存?
    答:是的,不过一般 malloc 出的地址不是固定值;所以使用指针的方式来释放。
  2. 问:认为应该free(&str),请问对吗?
    答:不对,free 的参数是一个 malloc 出的指针,以下代码应该好理解吧。
main()
{
	char *str = NULL;	
	str = malloc(100);
	strcpy(str, "hello");
	free(str);
}
  1. 问:malloc和free是如何记住这个申请的首地址的位置和大小的?
    答:一般使用链表来记录,不同系统的具体实现方法不一样。

感谢老师,追问:
1)如果是我问题中的代码,我该如何free呢?还是说这种用法是错误的,没办法free?
2)malloc free 一般是用链表来记录:就咱们学习的stm32来说,这个是谁来记录的呢,单片机有内置功能吗?还是说要自己写成代码完成这个功能?

  1. 使用 free(str); 来释放;
  2. 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数_lin111000713的博客-CSDN博客
    如果是按链接中的代码来实现,那么就是使用全局结构体来管理的。结构体中有个数组用来标记块是否被使用。
  3. 如果是用带系统的,一般都是别人帮你实现好了;如果是裸机,那没必要使用动态内存,或者找一下别人的代码,ctrl c 一下就行。