2016-08-10 13 views
0

私は現在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つ以上の異なる繰り返し文字が含まれている場合のみ、ポインタ間でデータを転送する方法でプログラムがクラッシュするようです。

+1

あなたの質問に[mcve]を含めるように[編集]してください。 –

+1

"ユーザーが文字列を文字ポインタに入力する" - 悪い考え!ポインタは配列ではありません。あなたは間違いなく、ユーザーが何かを**ポインタに**入力することを望んでいません! – Olaf

+1

私はあなたの 'Permute'関数を自分自身の' main'関数を書いてテストしました。そして、私がテストした入力に対してうまく働いているようです。私は 'AABB'、' AABBB'などをテストしました。あなたがここに示した 'Permute'関数に問題があるとは思っていません。質問を編集し、Permuteを呼び出す場所から関数を追加できますか? 'printPerm [permIndex]'が有効なメモリを指していない場合や、 'permIndex'が正しく初期化されていない場合、問題が発生します。 – sps

答えて

0

あなたはラッキーです:私のクリスタルボールはちょうど修理から戻って来ました!

// ALL CHECKS OMMITTED! 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static int permIndex; 

// place the two functions you published here 

// Uhmmm...well...but we need one 
int factorial(int n) 
{ 
    int f = 1; 
    do { 
    f *= n; 
    } while (--n); 

    return f; 
} 

int main(int argc, char **argv) 
{ 
    int f,i; 
    char **pperm; 
    char *word; 
    size_t length; 

    if (argc < 2) { 
    fprintf(stderr, "Usage: %s string\n", argv[0]); 
    exit(EXIT_FAILURE); 
    } 

    // work on copy 
    length = strlen(argv[1]); 
    word = malloc(length + 1); 
    strcpy(word, argv[1]); 

    // You either allocate memory as you need it but as you compute 
    // all combinations first, you need the whole memory for them 
    // at once. That means the amount of memory needed is known in 
    // advance and can be allocated at once 

    f = factorial((int) length); 
    // allocate memory for an array of (length)! pointers to char 
    pperm = malloc(f * sizeof(char *)); 
    for (i = 0; i < f; i++) { 
    // allocate memory for the n characters plus '\0' 
    pperm[i] = malloc(length + 1); 
    } 

    Permute(word, pperm, 0, length - 1); 

    // do something with the list 

    // print it 
    for (i = 0; i < f; i++) { 
    printf("%s\n", pperm[i]); 
    // we don't need the memory anymore: free it 
    free(pperm[i]); 
    } 
    // free that array of pointers mjentioned above 
    free(pperm); 
    // free the memory for the input 
    free(word); 

    exit(EXIT_SUCCESS); 
} 

これはいくつかの方法の1つです。

関連する問題