分类：电脑/网络-程序设计
问题：c语言中char*的初始化问题初始化一个字符指针变量，比较两种第 
初始化一个字符指针变量，比较两种第一种：char *a;  a = "Hi, you!";第二种： char *a; scanf("%s",a); 我听说是这样： 第一种方法是很普通很正常的赋值方法，而第二种赋值很危险，因为a的值未定，完全由你输入的字符串决定，这就有可能因为输入字符串太长破坏了正常的或者数据。但是， 在第一种方法里，a的赋值是在定义的下一句执行的，换句话说，a赋值时同样可能出现和第二种相同的危险。但为什么说第一种是安全的呢？
回答：第二种写法根本就是错的（虽然可以编译）。

问题在于，"Hi, you!"本身是一个字符串常量，跟代码一样是预先分配好内存的，所以第一种情况只是把"H"所在的内存地址复制给变量a而已。他跟char a[] = "Hi, you!";意思基本上是一样的。

但是第二句仅仅声明了指针，而没有为字符串预分配内存。假设a = 0，那么scanf的时候用户的输入就将写入地址0，导致我们常常看到的“内存0x0不能为写”的错误。

我们假设你的这个程序实际上不是这个意思，完整的写法是：
char *a;
a = (char *)malloc(256);
if (a)
{
  scanf("%s", a);
  free(a);
}
那么用户的输入就不能超过255字节。因为a的内容是分配到堆中的，超过256-1这个上限就会覆盖掉堆的其他内容，导致不可预知的后果。