2017-01-26 5 views
-3

ポインタによるchar配列の比較に問題があります。私は文字列ライブラリとiostreamの両方を使わずに作業しています。そのようにしたいと思います。C/C++でのポインタ(char配列)の比較

char *GetCurrentPath() 
{ 
char buffer[MAX_PATH]; 
if (!GetModuleFileNameA(NULL, buffer, MAX_PATH)) { 
    printf("GetModuleFileNameA failed, error: %d\n", GetLastError()); 
} 
return (buffer); 


} 
char *GetInstallPath() 
{ 
char buffer[MAX_PATH]; 
if (!SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE)) { 
    printf("SHGetSpecialFolderPathA failed, error: %d\n", GetLastError()); 
} 
strcat(buffer, "\\service.exe"); 

    return (buffer); 
} 



char *InstallPath = GetInstallPath(); 
char *CurrentPath = GetCurrentPath(); 

if (InstallPath == CurrentPath)...... 

ifステートメントは即時クラッシュを引き起こします。同じことがstrcompになります。

提案?

+0

ローカル変数へのポインタを安全に返すことはできません。 –

+0

ヒント:これらの2つの*ポインタ*は決して同じではありません...プレーンな 'char *'文字列のライブラリ 'string'構文を使用しています。 – usr2564301

+1

あなたはどの言語を使用しているかを明確にすることができますか?** CまたはC++ **?あなたのタイトルとタグはどちらも言えませんが、これは不可能です(これは恐らくタグ "C++"が編集された理由です)。しかし、「文字列ライブラリとiostreamを使用しない」*というステートメントは、C++を推奨しています。 – usr2564301

答えて

2

あなたが現在行っていることは、未定義の動作です。 2つの関数で使用しているバッファは、それらの関数にローカルに定義され、関数が終了するとスコープの外に出て、ランダムなスタックアドレスへのポインタを与えます。

は交換してください::char *buffer = new char[MAX_PATH]

や機能にメインから割り当てられたバッファを渡します:付きchar buffer[MAX_PATH];

char *InstallPath = new char[MAX_PATH]; 
GetInstallPath(InstallPath); 
をあなたは関数でバッファを割り当てるためにどちらかの必要

getパス関数を変更してください:

char *GetInstallPath(char *buffer) 

どちらの場合でも、メモリを解放するためにプログラムを終了する前に、ポインタを削除する必要があります。

さらに、2つの変数を比較しようとすると、文字列の内容ではなくポインタのアドレスが比較されます。あなたはstrcmp()かその機能のファミリーの何かを使用する必要があります。

+0

したがって、ポインタは関数の戻り値を指していませんか? –

+0

@MelvinLangvikスコープに含まれていないローカル変数へのアドレスが含まれているため、関数の戻り値が無効です。 –

+0

ああ、私は戻り値が範囲外である関数を指しています。戻り値のために、それはポインタであり、そのために関数のローカルスコープ内の何かを指しています。 –

0

あなたの関数は、内部で宣言された配列(char *)を返します。あなたのポインタは関数の外では未定義の値を持っています。あなたはそれをすることはできません。

あなたが動的に割り当てることができる:機能の実行が終了した後

char *buffer = malloc(MAX_PATH*sizeof(char)); 
0

両方のバッファがスタックに割り当てられているので、彼らは解放されます。したがって、ポインタ関数の戻り値は無効になります。

これを修正するには、char * buffer = new char [MAX_PATH];を使用して、ヒープにbuffer []を割り当てる必要があります。

ただし、手動でメモリを解放する必要があります。