为何 LPTSTR p = s.GetBuffer( 0 ),之后p="新内容"后,s的内容却没有发生变化

为什么 LPTSTR p = s.GetBuffer( 0 ),之后p="新内容"后,s的内容却没有发生变化?
  测试代码如下:
 
      CString s;
       printf("(0)INITIAL:\n");
       printf("CString s.length=%d\n",s.GetLength());
       printf("CString s=%s\n",s);

       s="abcd" ;
       printf("(1)before GetBuffer:\n");
       printf("CString s.length=%d\n",s.GetLength());
       printf("CString s=%s\n",s);

       s="abcdefghijklmnopqrstuvw";
       LPTSTR p = s.GetBuffer( 0 );
       printf("(2)after GetBuffer and before ReleaseBuffer:\n");
       printf("LPTSTR p=%s\n",p);     
       printf("p.length=%d\n",strlen(p));
       printf("CString s=%s\n",s);       
       printf("CString s.length=%d\n",s.GetLength());
       s.ReleaseBuffer( );

   printf("(3)after ReleaseBuffer:\n");
       printf("LPTSTR p=%s\n",p);     
       printf("p.length=%d\n",strlen(p));
       printf("CString s=%s\n",s);
       printf("CString s.length=%d\n",s.GetLength());     

       p = s.GetBuffer( 14 );
   p="i am elva he";
       printf("(4)after GetBuffer and before ReleaseBuffer:\n");
       printf("LPTSTR p=%s\n",p);     
       printf("p.length=%d\n",strlen(p));
       printf("CString s=%s\n",s);       
       printf("CString s.length=%d\n",s.GetLength());
       s.ReleaseBuffer( );
       
   printf("(5)after ReleaseBuffer:\n");
       printf("LPTSTR p=%s\n",p);     
       printf("p.length=%d\n",strlen(p));
       printf("CString s=%s\n",s);
       printf("CString s.length=%d\n",s.GetLength());   

以上代码输出为:


(0)INITIAL:
CString s.length=0
CString s=
(1)before GetBuffer:
CString s.length=4
CString s=abcd
(2)after GetBuffer and before ReleaseBuffer:
LPTSTR p=abcdefghijklmnopqrstuvw
p.length=23
CString s=abcdefghijklmnopqrstuvw
CString s.length=23
(3)after ReleaseBuffer:
LPTSTR p=abcdefghijklmnopqrstuvw
p.length=23
CString s=abcdefghijklmnopqrstuvw
CString s.length=23
(4)after GetBuffer and before ReleaseBuffer:
LPTSTR p=i am elva he
p.length=12
CString s=abcdefghijklmnopqrstuvw
CString s.length=23
(5)after ReleaseBuffer:
LPTSTR p=i am elva he
p.length=12
CString s=abcdefghijklmnopqrstuvw
CString s.length=23

问题如下:
(1) 为什么 在第4步时,p的内容改变了之后,s的内容没有发生变化,p的指针不是指向s的存放字符串的内存区域吗,两者的内容输出应该是一致的呀?为什么输出不一致呢?
(2) 为什么LPTSTR p = s.GetBuffer( 0 );写成LPTSTR p = s.GetBuffer();时提示 'GetBuffer' : function does not take 0 parameters


------解决思路----------------------
(1) 为什么 在第4步时,p的内容改变了之后,s的内容没有发生变化,p的指针不是指向s的存放字符串的内存区域吗,两者的内容输出应该是一致的呀?为什么输出不一致呢?
---------------------------------------------------------------------------------
CString str = _T("12345678");
LPTSTR lpData = str.GetBuffer(0);
lpData = _T("abc");

看样子你对指针还没有彻底理解呀,上述这句lpData = _T("abc");是啥意思你知道不?

lpData = _T("abc")的意思是:指针lpData指向常量字符串“abc”(位于静态存储区,内容为abc),而不是你理解的修改指针lpData所指内存的内容

你用一个LPTSTR lpData指向CString的数据区是不错,当执行lpData = _T("abc");这句的时候,改变了lpData这个指针所指向的地址,这个时候lpData所指向的地址就不再是CString的数据区,而是另外一块内存区域

把lpData = _T("abc");改为_tcscpy(lpData,_T("abc"));才是修改字符串指针所指内存里面的内容!
------解决思路----------------------
对的,在VC6.0中,CString类只有一个GetBuffer(_In_ int nMinBufferLength),你需要搞清楚nMinBufferLength参数的含义即可,不要去纠结
------解决思路----------------------
“这个nMinBufferLength” 就是说 你 至少要 多少字符。 你 不能 写 0, 通常 260 (MAX_PATH)

用后  要  Release
------解决思路----------------------
我给你举一个简单的例子,曾经负责对公司的代码库进行代码整理,看到一个结构体:

typedef struct tagDBConnInfo
{
CString strDbUrl;
CString strDbName;
CString strDbUser;
//int...;
//bool....;
}DBCONNINFO, *PDBCONNINFO;

当时我很费解,就问这是谁写的,为什么要这么写,结果那哥们儿跟我说了句“使用方便”!当时我简直是欲哭无泪

首先,没有跨平台的概念;
其次,那些数据库地址、名字、用户名撑死了不会超过32个字符吧,需要弄个CString类吗?类的构造、析构不消耗时间??
最后,也是最重要的一点,没有初始化的概念!有良好编程习惯的估计都会这么用上面那个结构体:
DBCONNINFO  dbInfo = {0};      //初始化
dbInfo.strDbUrl = _T("http.....");
...........
...........

试问红色的那句在运行过程中不会出错吗??