1

このプログラムを 3 つのコマンド ライン引数 (2 つの int と 1 つのファイル名) で実行しようとしているだけです。

私は自分のプログラムを次のように実行しています:

a.out 1 2 devices.txt

devices.txt は次のようになります。

1

私の主な方法は次のようになります。

int main(int argc, char* argv[]){
int MaxIterations, T, numDevices;
FILE *devices;

printf("Num arguments: %d \n", argc);
if(argc < 3 || argc > 4){
    printf("ERROR, need exactly 2 or 3 arguments!\n");
    return 1;
} else if (argc == 3){

    MaxIterations = argv[1]; // max iterations allowed
    T = argv[2]; // time interval
    devices = fopen("devices.in", "r");
} else {


    MaxIterations = argv[1];
    T = argv[1];
    devices = fopen(argv[3], "r");
    if(devices == NULL){
        fprintf(stderr, "CANT OPEN FILE: %s!\n", argv[3]);
        exit(1);
    }


}

FILE* file = fopen ("devices.txt", "r");
 int i = 0;

fscanf(devices, "%d", numDevices);
printf("Number of devices: %d \n", numDevices);

fclose(devices);
return 0;

}

セグフォルトを引き起こしている私は何を間違っていますか? セグフォルトが実際にトリガーされている場所を把握するために debug printf を追加しました。

fscanf(devices, "%d", numDevices);
4

2 に答える 2

6

コンパイラの警告を有効にします。

これは無効です:

fscanf(devices, "%d", numDevices);

これがあなたが欲しいものです:

fscanf(devices, "%d", &numDevices);

d変換指定子には、符号付き整数へのポインターが必要です。(初期化されていない)オブジェクトの値を渡していましたnumDevices

于 2013-02-06T20:51:08.277 に答える
0

問題は、fscanf関数が、ファイルから読み取られた値を格納する変数へのポインターを必要とすることです。あなたは次のようなものが必要です

fscanf(devices, "%d", &numDevices);

セグメンテーション違反が発生する理由は、元のコードでは、numDevicesの(初期化されていない)値が書き込み先のアドレスとして使用されているためです。有効な書き込み可能なアドレスである可能性は非常に低いため、セグメンテーション違反は通常の方法です。あなたのコンピュータは「いいえ!」と言います :)

于 2013-02-06T21:01:03.103 に答える