C ++奇怪的情况,例如将现有变量应用于新变量

时间:2012-05-10 14:24:33

标签: c++ string visual-c++ variables pointers

好吧,今天;我遇到了一个奇怪的小情况,例如: char* cFileCopy = strDrive; _

这应该使cFileCopy仅在此时保持strDrive的值,但是当我使用strcat(cFileCopy, cFileName);

strDrive

之后,cFileCopy的值也会更改为strcat()的值

_

我不确定发生了什么,但如果有人能对这种情况略有说明的话,这里是代码。

DWORD dwDrives = GetLogicalDrives();
char strDrive[3];

for(int i = 0; i<26; i++)
{
    wsprintf(strDrive, "%c:\\", 'A'+i);
    if(GetDriveType(strDrive) == DRIVE_REMOVABLE)
    {
        char* cFileName = new char[11];
        cFileName = "test.txt";
        char* cFileCopy = strDrive;
        strcat(cFileCopy, cFileName);
        MessageBox(NULL, strDrive, "Strange", MB_OK); //MSG - This shows drive:\test.txt when it should show only drive:\/
        MessageBox(NULL, cFileCopy, "OK", MB_OK); //MSG - This should be showing drive:\test.txt, which it does.
    }
}

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

你需要重新审视指针的工作方式 - 如果你将两个变量指向同一个内存(如此处),那么对一个指向的内存的修改也会改变另一个指向的值。

请注意,在strDrive调用中,您还会轻易地溢出3字节strcat缓冲区,这将导致隐藏的错误出现在线上。还有一个cFileName的泄漏没有delete[]调用以匹配new[](使用智能指针或std::string来简化此操作)。

如果你想要你期望的语义,你应该使用C ++ std::string,而不是原始指针。

答案 1 :(得分:0)

数组变量如strDrive [3]实际上存储了指向第一个值(strDrive [0])的指针。使用[n]偏移量来寻址数组的特定索引并取消引用它,在这种情况下,获取第n个字符。

当你做char * cFileCopy = strDrive;您正在将存储在strDrive中的地址复制到变量cFileCopy。这两个现在指向相同的memroy,所以当您改变cFileCopy所指定的值时,逻辑上,您可以更改strDrive指向的值。如果在调试时将鼠标悬停在两个变量上,您可能会看到它们显示的值相同(以十六进制表示的地址)。正如史蒂夫所说的那样,你需要更好的指针。

你可以用strcpy实现你想要的,但它永远不会很漂亮。

答案 2 :(得分:0)

cFileCopy只是一个没有自己的内存空间的指针,它引用了strDrive的内存。 正确地说,应该使用new或malloc为它创建空间,然后使用strcpy函数复制字符串strDrive。 所以使用

char* cFileCopy = new char[15];
strcpy(cFileCopy,strDrive);
strcat(cFileCopy, cFileName);
delete[] cFileCopy;

在这种情况下,strDrive不会被更改。不要忘记,最后释放记忆。