将一个字符串str中的字符放到结构数组中的有关问题

将一个字符串str中的字符放到结构数组中的问题
/*
目的:   将字符串str中的字符放到结构数组arr[0]中
*/
struct   man{
      char   *name;
}arr[2];

void   main()
{
char   *str   =   "ABCDEFG ";
struct   man   *p;
p   =   arr;
strcpy(p-> name,   str);
printf( "%s\n ",   p-> name);
}
正确的输出应该显示:   ABCDEFG
但现在运行后输出总显示:   Null   pointer   assignment
用   p-> name   =   str;   替换掉strcpy(p-> name,   str);就能正常输出了.

或者改为
struct   man{
      char   *name;
}arr[2]   =   {{ "                             "},
      { "                             "}};

void   main()
{
char   *str   =   "ABCDEFG ";
struct   man   *p;
p   =   arr;
strcpy(p-> name,   str);
printf( "%s\n ",   p-> name);
}
也能正常输出,这是为什么?

------解决方案--------------------
你这种做法不对,因为结构struct man中的name只是一个指针,并没有为其分配空间,所以直接给其赋值,是一种错误行为。要给某一指针类型的变量赋值,首先要为其分配好空间,然后再赋值:上面的程序可以简单的改为:
void main()
{
char *str = "ABCDEFG ";
struct man *p;
p = arr;
p-> name = (char*) malloc(strlen(str) + 1);
strcpy(p-> name, str);
printf( "%s\n ", p-> name);
}
------解决方案--------------------
#include <stdio.h>
#include <string.h>

struct man{
char name[10];
}arr[2];

void main()
{
char *str = "ABCDEFG ";
struct man *p;
p = arr;
strcpy(p-> name, str);
printf( "%s\n ", p-> name);
}