私は現在memcpy()に問題があります。誰かが助けてくれることを願っています。Cの文字ポインタ間で文字列を転送すると、プログラムがクラッシュするのはなぜですか?
私のプログラムでは、文字列を文字ポインタに入力し、可能なすべての順列を計算することができます。順列が生成されると(ユーザ入力ポインタが順列に変更される)、順列はmemcpyを介して第2のcharポインタにコピーされる。文字列に2つ以上の異なる繰り返し文字(例: "CCBB"または "AADD")がない限り、完全に動作します。ユーザーがこのようなことを入力すると、memcpy(またはstrcpyさえも)がプログラムをクラッシュさせます。
私は両方のポインタにもっと多くのメモリを割り当てようとしましたが、無駄であることが証明されました。これを除いて他のすべてが動作します。
Windows(MinGW)でgccを使用しているため、クラッシュの詳細は表示されません。単に「perm.exeが動作を停止しました」と表示されます。私は一連のprintf()ステートメントを使用し、プログラムがmemcpy()行でクラッシュしていることを発見しました。
コードについてのいくつかの詳細:
「単語」のcharポインタは、ユーザの入力を保持しています。それはプログラムによって順列に変形され、その内容は "printPerm"にダンプされます。 "printPerm"は、置換を保持するcharポインタ配列であり、アルファベット順に並び替えられた重複エントリが削除されたときに順列を出力するために使用されます。 "permIndex"は "printPerm"のインデックスであり、 "printPerm"に順列が追加されるたびに反復されます。
申し訳ありません。詳細はありませんが、テキストエディタとgccを使用すると、デバッガがあまり使われません。文字列に2つ以上の異なる繰り返し文字が含まれている場合のみ、ポインタ間でデータを転送する方法でプログラムがクラッシュするようです。
あなたの質問に[mcve]を含めるように[編集]してください。 –
"ユーザーが文字列を文字ポインタに入力する" - 悪い考え!ポインタは配列ではありません。あなたは間違いなく、ユーザーが何かを**ポインタに**入力することを望んでいません! – Olaf
私はあなたの 'Permute'関数を自分自身の' main'関数を書いてテストしました。そして、私がテストした入力に対してうまく働いているようです。私は 'AABB'、' AABBB'などをテストしました。あなたがここに示した 'Permute'関数に問題があるとは思っていません。質問を編集し、Permuteを呼び出す場所から関数を追加できますか? 'printPerm [permIndex]'が有効なメモリを指していない場合や、 'permIndex'が正しく初期化されていない場合、問題が発生します。 – sps