某公司的面试试题,虽然答案已给出,但理解不透澈,大家帮忙看看。解决方案

某公司的面试试题,虽然答案已给出,但理解不透澈,大家帮忙看看。
//==================================================
//题一
void   GetMemory(char   *p)
{
p   =   (char   *)malloc(100);
}
int   main(void)
{
char   *str   =   NULL;
GetMemory(str);
strcpy(str,   "hello   world ");
printf(str);
return   0;
}

问:运行main函数会有什么结果?
答:程序崩溃。
        因为GetMemory   并不能传递动态内存,
        main函数中的str一直都是NULL。
        strcpy将使程序崩溃。
疑问:为什么会崩溃

//==================================================
//题二
void   GetMemory(char   **p)
{
*p   =   (char   *)malloc(100);
}
int   main(void)
{
char   *str   =   NULL;
GetMemory(&str);
strcpy(str,   "hello   world ");
printf(str);
return   0;
}
问:运行main函数会有什么结果?
答:能够输出hello   world,但内存泄漏。
疑问:为什么内存泄漏


------解决方案--------------------
去看看高质量C++
------解决方案--------------------
都是林锐的高质量编程上面的题目

题一,main()中的指针并没有分配内存;
题二,分配了内存没有释放,所以内存泄漏,题一其实也内存泄漏
------解决方案--------------------
因为系统不允许使用0指针.
------解决方案--------------------
第一个问题 :参数的传递为单向的值传递!即使指针也是要遵循这个原则的!所以STR的地址不能改变!
第二个问题 就是内存没有释放,感觉 个人原则是有一个MALLOC 就要对应一个FREE

(本人新手,答案不知是否正确 大家指导~)