对构造体中字符串指针和字符数组赋值的区别是什么

对结构体中字符串指针和字符数组赋值的区别是什么?
这是谭老师书上结构体那一章的一个通讯录的例子,
#include"stdio.h"
#define NUM 3
struct mem
{
char name[20];
char phone[10];
};
main()
{
struct mem man[NUM];
int i;
for(i=0;i<NUM;i++)
{
printf("input name:\n");
gets(man[i].name);
printf("input phone:\n");
gets(man[i].phone);
}
printf("name\t\t\tphone\n\n");
for(i=0;i<NUM;i++)
printf("%s\t\t\t%s\n",man[i].name,man[i].phone);
}

我自己在定义结构体的时候写的是

struct mem
{
char *name;
char phone[10];
};

其他地方都一样,程序能编译但是无法执行了。

这在那里出了问题呢,我觉得字符串指针和字符数组这两者在这里是一样的啊。

不是很明白,请指导


------解决方案--------------------
你的问题说明你对指针还不理解
字符串数组在声明是就分配了空间
char name[20] 就有20个字节的大小的空间,可以存放八号19个字符的字符串
char *name;没有分配用来保存字符串的空间
要使用指针,记得分配空间,不然肯定各种错误
char *name=(char*)malloc(20);这样才有空间供你读写,不然name只是一个随机值,而这个随机的值很有可能是一个不可进行操作的内存地址。

我说的这些你可以另外用个简单的程序来验证,在这里还是要字符数组好,不然麻烦的要死。
------解决方案--------------------
struct mem *p;//定义指针

p->name=(char*)(char*)malloc(20);//分配空间

strcpy(p->name,NAME);// 赋值,NAME,你知道的

for(i=0;i<NUM;i++)
printf("%s\t\t\t%s\n",p->.name,p->phone);
}