我对 C++ 有点生疏,所以我正在寻求有关字符串指针问题的帮助。
首先,让我们考虑一些带有整数的指针基础知识:
void SetBob(int* pBob)
{
*pBob = 5;
}
int main(int argc, _TCHAR* argv[])
{
int bob = 0;
SetBob(&bob);
}
运行时,main() 创建一个整数并将其地址传递给 SetBob。在 SetBob 中,值(在 pBob 指向的地址处)设置为 5。当 SetBob 返回时,bob 的值为 5。
现在,让我们考虑一个字符串常量:
typedef wchar_t WCHAR;
typedef const WCHAR *PCWSTR;
void SetBob(PCWSTR* bob)
{
*bob = L"Done";
}
int main(int argc, _TCHAR* argv[])
{
PCWSTR bob = L"";
SetBob(&bob);
}
运行时,main() 创建一个指向空字符串的 PCWSTR,并将其地址传递给 SetBob。在 SetBob 中,PCWSTR 指针现在指向一个 Done 字符串。当 SetBob 返回时,bob 的值为“Done”。
我的问题是:
- 在调试器中,我看到调用 SetBob 后 bob 字符串设置为 Done。但为什么这行得通?在整数示例中,我为整数分配了空间,因此我可以在该空间中存储一个值。但是,在字符串示例中,PCWSTR 只是一个指针。这里的想法是字符串常量也在内存中,所以我只是指向那个常量?
- 因为“完成”文字在 SetBob 中,我是否必须担心尽管指向它,“完成”的内存可能会被回收?例如,如果我创建了一个 WCHAR 缓冲区,我会将“Done”复制到缓冲区中,这样我就不会担心了。但是因为我指向函数中的文字,所以在函数结束后的某个时候,该文字是否会被销毁,让 bob 出乎意料地指向什么?