关于strcpy()函数

strcpy的函数原型是char *strcpy( char *strDestination, const char *strSource );
可是我使用下述代码
C/C++ code

    char *str1="ssss";
    char *str2="11";
    strcpy(str1,str2);
    cout<<str1;


系统显示该内存不能为written!
但是我使用如下代码
C/C++ code

    char str1[]="ssss";
    char *str2="11";
    strcpy(str1,str2);
    cout<<str1;


就可以正常显示,请问这是为什么?
还有一事儿小弟始终想不明白,“ssss”这种字面值字符串,它的类型不是const char*类型吗?为什么可以赋给char*类型的指针?

作者: cstringfengle   发布时间: 2011-06-15

char *str1="ssss";
  char *str2="11";
  strcpy(str1,str2); //str1存在常量存储区,内存不可读
  cout<<str1;
======== 
 char str1[]="ssss";
  char *str2="11";
  strcpy(str1,str2); //str1定义在栈内存,可以读写。还可以使用malloc申请str1内存。也可以修改,
  cout<<str1;

作者: dizuo   发布时间: 2011-06-15

char *str1="ssss";
相当于
const char * const str1

也就是说="ssss";在常量区
如果是数组的话,其值只是在常量区的一个拷贝,确切说是在栈上

作者: namelij   发布时间: 2011-06-15

存在一个隐式转换
 char *str1="ssss";//"ssss"是存储在栈区的
str1被强制转换为 const char*了

作者: hnuqinhuan   发布时间: 2011-06-15

感谢您的回复,那么第二个问题呢?为什么const char* 类型的“sss”可以赋值给char*类型的str1呢?
引用 1 楼 dizuo 的回复:

char *str1="ssss";
char *str2="11";
strcpy(str1,str2); //str1存在常量存储区,内存不可读
cout<<str1;
========
char str1[]="ssss";
char *str2="11";
strcpy(str1,str2); //str1定义在栈内存,可以……

作者: cstringfengle   发布时间: 2011-06-15

这个是特例吗?只有在处理c风格字符串的时候,才会发生这种转换吗?
引用 3 楼 hnuqinhuan 的回复:

存在一个隐式转换
char *str1="ssss";//"ssss"是存储在栈区的
str1被强制转换为 const char*了

作者: cstringfengle   发布时间: 2011-06-15

把const char*赋值给char* 应该是错误的呀!为什么相当于了呢?这是一个特例吗?
引用 2 楼 namelij 的回复:

char *str1="ssss";
相当于
const char * const str1

也就是说="ssss";在常量区
如果是数组的话,其值只是在常量区的一个拷贝,确切说是在栈上

作者: cstringfengle   发布时间: 2011-06-15

好像是刚才我看到过类似的一贴,..常量不能修改

作者: self001   发布时间: 2011-06-15

c++内存,LZ要复习一下le
http://blog.csdn.net/yfkiss/archive/2011/06/14/6542894.aspx

作者: yfkiss   发布时间: 2011-06-15

学习了

作者: antion692980794   发布时间: 2011-06-15

非常感谢您的帖子,不是复习,第一次看这方面的知识,请问还有哪些C++的经典书籍会介绍C++的内存呢?请您推荐几本,小弟是菜鸟,谢谢啦!
引用 8 楼 yfkiss 的回复:

c++内存,LZ要复习一下le
http://blog.csdn.net/yfkiss/archive/2011/06/14/6542894.aspx

作者: cstringfengle   发布时间: 2011-06-15