解決済み解決策については、質問の下部を参照してください。
関数に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の長さの配列として宣言したことがわかりました。これにより、スタックフレームが最大になりました。バッファ宣言をグローバル変数に変更することでうまくいき、コードが実行されます。
助けてくれてありがとう!