c语言小程序运行内存错误?求大神

#include
#include
void init(int *p);
int main(void)
{
int *a=NULL;
init(a);
printf("%d\n",*a);
return 0;
}
void init(int *p)
{
p=(int *)malloc(sizeof(int));
*p=100;
printf("%d\n",*p);
}
[root@VM_98_146_centos data steucture]# ./a.out
100
Segmentation fault

*p = 100 是把p的地址变成`100 当然就挂了啊

是定义头的问题吗,代码没问题

int *a = NULL;已经将指针a释放,调用init时相当于init(NULL),并没有在init方法中操作的地址为空,无用,
p = (int *)malloc(sizeof(int))是在给p重分配地址,并不是将p指向该地址,所以存储数据是其实是将指针p地址处的数据改为100,so,全是乱搞
修改:
① *a 不能置为NULL
② p=(int *)malloc(sizeof(int));改为 *p = *((int *)malloc(sizeof(int)))以为将原来a指向((int *)malloc(sizeof(int))),然后去操作a指向的数据

楼上正解,p是a的拷贝,p指向a指向的地址,结果你又把p重新分配内存,那么p就指向新的内存,p和a此时已经指向不同的内存了,这时候a仍然是NULL,当然段错误啦。