2010-11-23 11 views
2

私は自分自身を混乱させる午前ですが、私はここにあります。私は最近、ポインタを使ってより快適に感じるポイントにもっと慣れ始めましたが、strcpy_s()のバッファが小さすぎるというエラーが発生しています。C++ strcpy_s()を使用して、char配列へのポインタポインタ

std :: stringの代わりにchar配列を使用しているコメントはありません。char配列を中心としたHL2SDKのために、私はそのパターンに固執しています。

void func_a() 
{ 
    char *szUserID = new char[64]; 
    char *szInviterID = new char[64]; 
    char *szGroupID = new char[64]; 
    sprintf(szUserID, "%I64d", GetCommunityID(szUserSteamID)); 
    sprintf(szInviterID, "%I64d", GetCommunityID(g_CvarSteamID.GetString())); 
    GetGroupCommunityID(1254745, &szGroupID); // Group Steam Community ID 
} 

void GetGroupCommunityID(int groupID, char **communityID) 
{ 
    int staticID = 1035827914; 
    int newGroupID = 29521408 + groupID; 

    char *buffer = new char[64]; 
    snprintf(buffer, sizeof(buffer), "%d%d", staticID, newGroupID); 
    strcpy_s(*communityID, sizeof(*communityID), buffer); 

    delete buffer; 
} 
+0

動的に割り当てられた 'char'の配列が必要な場合は、通常、' std :: vector 'を使用して取り除くことができます。なぜここでうまくいかないのか分かりません。 –

+2

スタック上で宣言されたばかりのcharバッファを新しくして削除するのはなぜですか? –

答えて

5

*communityIDの実行時の長さを判断するコンパイル時の構造体であるsizeofを使用しているという問題があります。これは基本的にsizeof(char*)に解決されます。あなたが望むものは、*communityIDで利用可能なバイト数/文字数です。この情報は、値、この例でも

GetGroupCommunityID(1254745, &szGroupID, sizeof(szGroupID)); 

void GetGroupCommunityID(int groupId, char** communityID, size_t length) { 
    ... 
    strcpy_s(*communityID, length, buffer); 
} 

ダブルポインタと一緒に渡される必要がありますが、ポインタを変更していないので、ちょうどそれが内容だ、不要です。あなたは定数値(CHAR * szGroupID =新しいのchar [64])なぜ値64と定数を宣言し、この値を使用していないを使用している場合、単一のポインタは、その

GetGroupCommunityID(1254745, szGroupID, sizeof(szGroupID)); 

void GetGroupCommunityID(int groupId, char* communityID, size_t length) { 
    ... 
    strcpy_s(communityID, length, buffer); 
} 
+0

"実行時の長さを決定するためのコンパイル時の構成" - それは擬似語ではありませんか? –

+0

@Alexなので、なぜ元のソリューションが失敗したのですか? – JaredPar

0

strcpy_sに第2のパラメータは、最初のパラメータによって指されるバッファの実際のサイズ(文字数)です。 sizeof(*communityID)は、char *ポインターのサイズのみを表示します。通常、32ビットシステムでは4バイトです。 *communityIDの実際のサイズをGetGroupCommunityID関数に渡してstrcpy_sに渡す必要があります。

1

のためにうまくやるだろう。ちなみに、sizeof(szGroupID)は32ビットコンパイラでも4バイトも返します。