-1

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

这应该只在这一点上cFileCopy保持 的值strDrive,它确实如此,但是当我使用strcat(cFileCopy, cFileName);

的值strDrive也更改为cFileCopyafter的值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.
    }
}

任何帮助表示赞赏,谢谢。

4

3 回答 3

2

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

请注意,您还在strDrive该调用中轻松地溢出了 3 字节缓冲区strcat,这将导致隐藏的错误浮出水面。还有一个泄漏,cFileName它没有delete[]调用匹配new[](使用智能指针或std::string简化它)。

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

于 2012-05-10T14:29:48.597 回答
0

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

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

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

于 2012-05-10T14:39:31.523 回答
0

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

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

在这种情况下 strDrive 不会被改变。不要忘记,要释放内存就结束了。

于 2012-05-15T21:49:34.637 回答