0

以下のコードでは、セグメンテーション違反の原因が見つからないようです。evaluate() から main() に戻った後、コメントのある行でコードがクラッシュします。このコードを gdb で調べたところ、評価関数内ではすべて問題ないようです。出力は正しく入力されていますが、メインに戻った後、メモリ内の何もアクセスできません。gdb の "p j" は、他の変数を出力しようとすると、メモリにアクセスできないというエラーを返します。スタックに多くの値が必要かどうかを確認しましたが、スタック サイズを大きくしても効果はありません。

クレイジーなことは、このエラーを解決できるということですが、なぜそれが何かを変えるのかわかりません。evaluate() のどこかに int 宣言 (例: ) を追加するとint iAmNotUsedEver;、コードは突然セグメンテーション エラーを引き起こさず、gdb で完全に動作します。編集:evaluate()でnode[116]を動的に割り当てることでint *node = malloc(116*sizeof(int));も問題は解決しますが、やはり理由がわかりませんか?

関数の評価: (コードの一部を削除しました。そうしないと、長すぎます)

void evaluate(int *parameter, int output[][16]) {
    int node[116];
    node[0] = 0;
    output[0][0] = !node[0];
    node[1] = parameter[0];
    output[0][1] = !node[1];
    output[0][2] = !node[0];
    ...
    node[34] = !node[114] && !node[45];
    node[45] = !node[34] && !node[105];
    output[11][15] = node[45];
}

主な機能:

int main(int argc, char *argv[]) {
    int i;
    int j;
    int k;
    int ret;
    int parameter[8];
    int output[12][16];
    FILE *paramFile;
    FILE *outFile;

    paramFile = fopen(argv[1], "r");
    if (paramFile == NULL) {
        printf("I couldn't open the parameter file.\n");
        exit(0);
    }
    outFile = fopen(argv[2], "ab");
    if (outFile == NULL) {
        printf("Something went wrong with the output file.\n");
        exit(0);
    }
    while(1){
        for(i=0;i<8;i++){
            ret=fscanf(paramFile, "%d", &parameter[i]);
            printf("parameter: %d\n", parameter[i]);
        }
        if(ret!=1){
            break;
        }
        for(j=0;j<12;j++){
            for(k=0;k<16;k++){
                output[j][k] = 2;
            }
        }
        evaluate(parameter,output);
        printf("Evaluation is done. \t %d\n",i);
        for(j=0;j<12;j++){ //SEG FAULT HERE
            for(k=0;k<16;k++){
                fprintf(outFile, "%d", output[j][k]);
            }
            fprintf(outFile,"\n");
        }
        fprintf(outFile,"\n\n\n");
    }
    printf("Closing files\n");  
    fclose(paramFile);
    fclose(outFile);
    return 0;
}
4

1 に答える 1

0

まず、少なくとも2つの引数があるかどうかを確認する必要があります。これもセグメンテーション違反を引き起こす可能性があります。

if (argc < 3)
    return -1;

次に、評価では、それらは固定配列であるため、パラメーターを渡す必要があります

void evaluate(int parameter[8], int output[12][16]) {
    ...
}

これもできます

void evaluate(int *parameter, int **output) {
    ...
}

セグメンテーション違反は、この2つの宣言で1つを使用することを回避できると思います。

于 2013-03-21T09:17:05.340 に答える