2009-08-27 9 views
2

従うことを試みるthis例。 (Section String sorting ...)
stdlibのqsort.cにこのクラッシュを引き起こすような何かがありますか?
私も試しましたcstring_cmp strncmpは最大30文字を指定しています。
* fileArray [20]は文字列で正しく埋め込まれているようです。
ありがとうございます。それが立つように、未初期化ポインタの配列だ、qsortクラッシュプログラム - C

char* fileArray[20]; 

:あなたが移入するにはどうすればよい

/* qsort C-string comparison function */ 
    int cstring_cmp(const void *a, const void *b) 
    { 
     const char **ia = (const char **)a; 
     const char **ib = (const char **)b; 
     return strcmp(*ia, *ib); 
     /* strcmp functions works exactly as expected from 
     comparison function */ 
    } 
+0

質問がC++にタグ付けされたのはなぜですか?それはCコードであり、あなたはそれを(ハード)Cの方法でやっています。 – sbi

+0

文字列の初期化に使用したコードを表示できますか? –

+0

おそらく、彼はコードをコンパイルするためにC++コンパイラを使用していました。そして、おそらく、unitialisedメモリが満たされているように、標準に(おそらく)矛盾があります。これは_matters_です。 –

答えて

4

あなたは10個の文字列でfileArrayを埋めているだけで、10個のエントリは初期化されていないと言います。

qsortを呼び出すと、strings_len引数として20が渡されます。 これは、もちろん、未定義の動作になります。

正確な情報をqsortに与える必要があります。

配列に10個の文字列を渡す場合は、ソートする要素の数として10を渡す必要があります。

注:以前の回答に従うと、cstring_cmpにブレークポイントを設定すると、無効なデータでcompareメソッドが呼び出されたときにすぐにクラッシュが発生します。

2

char* ptr_fileName; 
char* fileArray[20];//number of files 
size_t strings_len; 

ptr_fileName = (char*)malloc((strlen(FindFileData.cFileName)+1)*sizeof(char)); 
memcpy(ptr_fileName, FindFileData.cFileName, strlen(FindFileData.cFileName)+1); 
fileArray[i] = ptr_fileName; 



strings_len = sizeof(fileArray)/sizeof(char *);   
qsort(fileArray, strings_len, sizeof(char *), cstring_cmp); 
//crashing in qsort.c 

のqsort C-stringは、機能を比較します。

+0

配列をどのように配置するかを追加しました。 –

+0

いいえ、あなたはいません。完全な実コードを投稿してください。 –

1

*fileArray[20] seems to be correctly populated with strings.

fileArrayの前にアスタリスクが付いているため、配列に入力された方法の正確さが疑わしいものになります。 私はあなたのコードを壊すかもしれない他の何も観察しません。

0

fileArrayの内容を初期化していないので、法的なcharポインタではなくランダムなメモリが含まれています。

2

cstring_cmpにブレークポイントを設定し、毎回呼び出されるのを監視します。

究極のクラッシュがcstring_cmpまたはqsortで発生するかどうかを確認してください。 クラッシュ直前のfileArrayの状態を確認します。

関連する問題