初学者关于字符串函数strcpy的疑惑

菜鸟关于字符串函数strcpy的疑惑
char *p;
strpy(p,"abc");
puts(p);

这里会报错,书中解释为,p未初始化。所以“abc”被复制到任何地方
应改为
char *p;
char b[50];
p=b;
strpy(p,"abc");
puts(p);

而我的理解:无论p的初始值为多少。总是存在于内存中的地址。不妨碍复制和显示。
求问我的思想错在哪里
------解决思路----------------------
问题就出在"无论p的初始值为多少。总是存在于内存中的地址"上.当p使用的地址是另外程序使用时,就有可能被写入数据,结果就可能不是你所希望的"abc"了,所以,使用指针必须要初始化.
------解决思路----------------------
你的理解没有错, 可是既然没有定义的值,是不是乱拷贝呢,你的不知道拷贝到内存的哪里了?如果那快内存是操作系统的代码呢,那操作系统不就被你破坏了吗,所以说能复制,但是操纵系统 不让你复制.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char *p;
p = (char *)malloc(sizeof(char) * 10);

strcpy(p,"asdfg");
puts(p);
exit(0);
}

------解决思路----------------------
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

------解决思路----------------------
char *p; 这句仅仅是告诉编译器留出4个字节来保存地址,这个地址并没有指向任何内存区域,所以没有办法往指针p复制字符。另外即使p指向字符串,比如  char *p = "hello",这个字符串也是保存在常量区中,不能被修改。
char a[30] 声明了一块内存空间,大小30字节,所以能用strcpy来向其中复制字符串。