-1

さて、今日; 私はeg char* cFileCopy = strDrive;_で奇妙な小さな状況に遭遇しました

これは、この時点cFileCopyでのみ値を保持する必要がありますが、使用するとstrDrivestrcat(cFileCopy, cFileName);

の値もafterstrDriveの値に変わりますcFileCopystrcat()

_

何が起こっているのかわかりませんが、誰かが状況に少し光を当てることができれば、これがコードです。

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

0

strDrive [3]などの配列変数は、実際には最初の値(strDrive [0])へのポインターを格納します。[n]を使用すると、そのアドレスが配列の特定のインデックスにオフセットされ、逆参照されます。この場合、n番目の文字が取得されます。

char * cFileCopy=strDrive;を実行する場合 strDriveに格納されているアドレスを変数cFileCopyにコピーしています。2つは同じメモリを指すようになったため、論理的には、cFileCopyが指す値を変更するときに、strDriveが指す値を変更します。デバッグ中に2つの変数にマウスを合わせると、同じ値(16進数のアドレス)が表示されていることがわかります。スティーブが言ったように、ポインタのより良い理解はあなたが必要とするものです。

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 に答える