为何 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
------解决思路----------------------
我给你举一个简单的例子,曾经负责对公司的代码库进行代码整理,看到一个结构体:
当时我很费解,就问这是谁写的,为什么要这么写,结果那哥们儿跟我说了句“使用方便”!当时我简直是欲哭无泪
首先,没有跨平台的概念;
其次,那些数据库地址、名字、用户名撑死了不会超过32个字符吧,需要弄个CString类吗?类的构造、析构不消耗时间??
最后,也是最重要的一点,没有初始化的概念!有良好编程习惯的估计都会这么用上面那个结构体:
DBCONNINFO dbInfo = {0}; //初始化
dbInfo.strDbUrl = _T("http.....");
...........
...........
试问红色的那句在运行过程中不会出错吗??
测试代码如下:
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.....");
...........
...........
试问红色的那句在运行过程中不会出错吗??