好吧,今天;我遇到了一个奇怪的小情况,例如: 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.
}
}
感谢任何帮助,谢谢。
答案 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不会被更改。不要忘记,最后释放记忆。