1

ファイルを取り込んでそこから値を読み取るこの C コードを書いていますが、コードはまだ何も実行していませんが、これがこれまでのところです。プログラムは、4 つの malloc を呼び出しているブロックでクラッシュしています。y、f、および yp をコメントアウトすると、プログラムは正常に動作します。何が原因なのかわからない。そのため、どんな助けでも大歓迎です。

注: gcc を使用して ubuntu でこれをテストしています。そして、malloc を "(float *)" にキャストしようとしましたが、それでも同じエラーが発生します。

int main( int argc, char *argv[])
{
    FILE *rhs, *output;
    int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;

    rhs = fopen(argv[1], "r");
    // ab+ opens file for writting and creates the file if need be
    output = fopen(argv[2], "ab+");
    niter = atoi(argv[3]);

    // check if files open up or not, if not exit.
    if((rhs == NULL) || (output == NULL))
    {
        printf("Error Opening files.\n");
        exit(1);
    }

    // read in N
    fscanf(rhs, "%d", &n);

    // THIS IS THE BLOCK CAUSING THE CRASH
    // CODE WORKS WHEN I COMMENT OUT LINES AND ONLY LEAVE ONE OF THEM IN
    // generate array to hold values from rhs file
    float *numbers = malloc(sizeof(float) * ((n1)*(n1)));
    float *y = malloc(sizeof(float) * ((n1)*(n1)));
    float *f = malloc(sizeof(float) * ((n1)*(n1)));
    float *yp = malloc(sizeof(float) * ((n1)*(n1)));

    // get numbers and store into array
    while(fscanf(rhs, "%f", &numbers[i]) != EOF)
    {
        printf("In while %f\n", numbers[i]);
        i++;
    }

    fclose(rhs);

    return 0;

}

4

4 に答える 4

2

1 つの問題は次のとおりです。

n1からの初期化されていない値で初期化していますn:

int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;
                                        ^
                                        +-- "n" is not initialized here, might have any value.
                                            thus, "n1" is also not initialized to a known value.

したがって、 への呼び出しは、malloc割り当てられないほど大きな値を受け取る可能性があります。「n」を読み取った後、「n1」を初期化します。

// read in N
fscanf(rhs, "%d", &n);
n1 = n + 1;

malloc()いずれにせよ、メモリを割り当てることができなかった場合に備えて、からの戻り値をチェックして NULL が返されたかどうかを確認する価値があります。

于 2013-03-19T08:27:00.417 に答える
1

呼び出しのn1時点でガベージが含まれていmalloc()ます。したがって、膨大な量のメモリを割り当てようとするだけです。

于 2013-03-19T08:33:45.793 に答える
0

数値 y、f、yp の値をチェックして、メモリが正常に割り当てられたかどうかを確認します。値が NULL の場合、メモリを割り当てることができません。n1 の値はどのくらいですか?

于 2013-03-19T08:28:05.633 に答える
0

n1を呼び出した時点で が定義されていないためですmalloc()

int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;

上記の行は を初期化していないnためn1 = n + 1、未定義の値を に代入しn1ます。

n1 = n + 1;の後に置く必要があるかもしれませんfscanf(rhs, "%d", &n);

于 2013-03-19T08:29:50.203 に答える