0

このコードUnhandled exception at 0x00401189 in ControlFileChanges.exe: 0xC0000005: Access violation writing location 0xbaadf00dでは、最初の strcpy コマンドで実行時例外が発生します。

char** withStrings(string s1, string s2, string s3, string s4, string s5)
{
char** pipes;
pipes = (char**) malloc(sizeof(*pipes)*5);

strcpy(pipes[0],s1.c_str());
strcpy(pipes[1],s2.c_str());
strcpy(pipes[2],s3.c_str());
strcpy(pipes[3],s4.c_str());
strcpy(pipes[4],s5.c_str());

return pipes;
}

何が問題なのですか?(これは、実際のコードで同様のロジックを使用するために使用しているサンプルです)。

4

3 に答える 3

7

pipes[0]pipes[1]などにメモリを割り当てていません。

これはCではなくC++なので、new代わりに使用することを検討しましたmallocか?または多分avectorまたはstringsを使用しますか?

于 2012-07-31T07:18:38.600 に答える
2

定数はここで多くのこと0xbaadf00dを教えてくれます。これは、Microsoftを使用していて、デバッグモードでヒープメモリを割り当てており、初期化していないことを示しています。

あなたはこれを見ることができます-あなたはあなたmalloc()を作るために呼び出しましたが、呼び出す前に有効なものを指すようにchar**各ポインタを個別に設定していません。つまり、はポインタへのポインタであり、ポインタを割り当てるだけですが、ポインタが指すものは何もありません。char*strcpychar**char**

できれば、C文字列を完全に避けることをお勧めします。

于 2012-07-31T07:19:59.703 に答える
0

char** pipes;-5つの文字列のアドレスを格納するポインタの配列です。したがって、以下のステートメントで5つの文字列のアドレスを格納するためのメモリを割り当てました。

パイプ=(char **)malloc(sizeof(* pipes)* 5);

この後、各文字列を格納するためのメモリを割り当てる必要があります。したがって、以下のようにコードを更新します。

#define MAX_NO_STRING 5
#define MAX_STR_SIZE 50

pipes = (char**) malloc(sizeof(char*)*MAX_NO_STRING); 
for(i = 0; i < MAX_NO_STRING; i++)
{
    pipes[i] = (char*)malloc(sizeof(char) * MAX_STR_SIZE);
}

注:mallocのNULLチェックに注意してください

于 2012-07-31T10:29:18.037 に答える