0

fgets が原因で、以前にコンパイルされたプログラムがある時点でセグメント フォールトになる理由はありますか? それに関連するコードはまったく変更しませんでした。突然、ファイルを開くのに失敗したと思いますが、15分前のようにファイルでテストしました....検索機能を追加しただけなので、何が問題なのかわかりません....

PuTTy 経由で接続しているサーバーでしょうか?

int createarray( int **arrayRef, FILE *fptr){
    int size = 0, i;
    char rawdata[100];

    while (fgets(rawdata, 99, fptr) != NULL){
        size++;
    }

    rewind(fptr);
    *arrayRef = malloc(sizeof(int) * size);

    for ( i = 0; i < size; i++ ){
     fgets(rawdata, 99, fptr);
     *(*arrayRef + i) = atoi(rawdata);
    }


    return size;
}


      int main ( int argc, char **argv ) {  //main call

    // declare variable to hold file
    FILE *inFilePtr = fopen(*(argv + 1), "r");
    int **aryHold;
    int numElements, sortchoice, key, foundindex;

    // Call function to create array and return num elements
    numElements = createarray(aryHold, inFilePtr);

これはコンパイルされ、正しく実行され、それ以来変更されていないコードです。GDB は、fgets にエラーがあると言います。

4

1 に答える 1

0

OK、「機能」する理由は、重要でないメモリの場所を壊していたからです。コードを変更すると状況が変わり、重要なものが破壊されています。

初期化されていないポインターを createarray() に渡しています。あなたは次のようなことをしたかった:

int* aryHold;
//...
... createarray(&aryHold ... 

ところで、多くのコンパイラには、この種のエラーをキャッチする機能があります。まだ行っていない場合は、コンパイラにエラー チェック オプションがあるかどうかを確認することをお勧めします。これにより、面倒な作業を省くことができます (また、誤って "機能する" だけの他のコードを見つけることもできます)。

于 2013-02-12T04:57:38.057 に答える