1

解決済み解決策については、質問の下部を参照してください。

関数にString引数を渡すのに問題があり、関数が呼び出されたときにセグメンテーション違反が発生します。プログラムはコマンドライン入力を受け取り、検証後に関数に提供されたファイルを渡します。

私の関数コードは次のようになります。

char *inputFile; //
inputFile= argv[2];
strcpy(inputFile, argv[2]);
compress(inputFile){ 

//file open and creation work bug-free
//compression action to be written
void compress(char inputFile){
    //compression code here
}

関数が呼び出されると、segfaultがスローされ、inputFileの値は0x00000000です。関数呼び出しの前は、メモリの場所とテストファイルパスの値がありました。

関数プロトタイプと一致する、私が試したバリエーションのいくつか:

compress(char *inputFile)
compress (char inputFile[])

変数も変更しました。

デバッガーで有効なメモリアドレスと値を持つ変数をパラメーターとして使用すると、突然消去されるのはなぜですか?

編集1:

ここに提案を取り入れて、inputFile= argv[2]行を削除すると、デバッガーはstrcpy関数が機能していることを示しています。

compress(char *inputFile)ただし、 Edwin Buckcompress(argv[2])ごととunwindごとの両方を試しましたが、どちらの変更でも結果はCannot access memory at address 0xBEB9C74C

奇妙なことに、ファイル検証関数checkFile(char inputFile[])inputFile値を処理しますが、同じパラメーターをcompress(char inputFile[])関数に渡すと、セグメンテーション違反が発生します。

編集2-解決済み

教授を45分間困らせると、何かが起こっていることがわかります。compress()メソッド内でファイル読み取りバッファーを5MBの長さの配列として宣言したことがわかりました。これにより、スタックフレームが最大になりました。バッファ宣言をグローバル変数に変更することでうまくいき、コードが実行されます。

助けてくれてありがとう!

4

3 に答える 3

4

を保持していたメモリに書き込むべきではありませんargv[2]

文字列がどのように表現されるかをよく理解していないようです。ポインター (割り当てを使用) と実際の文字 (を使用) の両方をコピーしていますstrcpy()

compress(argv[2]);その引数が有効であることを確認したら、それを行う必要があります。

于 2011-03-01T15:44:05.807 に答える
2

まず、何かを別の場所にコピーするにはargv[2]、「別の場所」のためのメモリが必要です。のサイズに基づいてメモリを割り当てることもできますargv[2]が、この単純な例では、非常に大きな固定サイズのバッファで十分です。

char inputfile[2048];

代入演算子でこれを実行しようとしたようですが、実際には意図したとおりに動作しません。

// this is not the way to what you seek, as it doesn't create any new memory for inputfile
char* inputfile = argv[2];

変数をプロシージャに渡すinputfile場合、複数の文字を渡す必要があるためvoid compress(char inputfile)、オプションではありません。それは去る

compress(char *inputFile)  // I prefer this one
compress (char inputFile[])

どちらも機能しますが、私の経験では、一部の古いコンパイラはポインターと配列のセマンティクスを区別する傾向があるため、最初の方法が優先されます。これらのコンパイラには、配列をポインタにキャストする際の問題はありません (これは C 言語仕様の一部として必要です)。ただし、そのようなシステムでは、ポインターを配列にキャストするのは少し面倒です。

于 2011-03-01T15:51:49.567 に答える
0

char * が使用するメモリを割り当てていません。char *inputfile で行ったことはすべて、ポインターが割り当てられていることです。

于 2011-03-01T15:45:38.337 に答える