以前也经常用到指针, 最近一段时间用着用着就懵了, 做下笔记, 以防以后用到会出现这种情况, 本程序在VC上面测试用
下面是C程序:
#include <stdio.h>
typedef struct T_
{
int a;
struct T_* next;
}TB, *TP;
void test_malloc_1(void *p)//不成功
{
p = (void*)malloc(sizeof(TB));
}
void test_malloc_2(void **p)//成功
{
*p = (void*)malloc(sizeof(TB));
((TP)*p)->a = 2;
}
void test_malloc_3(void *p)//成功,此时p中以有成功申请内存的情况下
{
((TP)p)->next = (TP)malloc(sizeof(TB));
((TP)p)->next->a = 3;
}
void test_free_1(void*p)
{
free(((TP)p)->next);
((TP)p)->next = NULL;
free(p);
p = NULL;
}
void test_free_2(void**p)
{
free(((TP)*p)->next);
((TP)*p)->next = NULL;
free(*p);
*p = NULL;
}
int main()
{
void *p = NULL;
test_malloc_1(p);
test_malloc_2(&p);
test_malloc_3(p);
printf("%d, %d\n", ((TP)p)->a, ((TP)p)->next->a);
test_free_1(p);//内存已经被释放, 只是p没有被赋空,p->next被赋空
if(NULL == p)
{
printf("free ok!!\n");
}
test_free_2(&p);//执行到此处会蹦, 因为内存已经被释放
i