0

私はCで関数を持っています:

int concanatedProduct(int n, int x, int size)
{
    char numberString[10];
    long arr[size];
    int cnt = 0;

    long product = 0;
    int digit = n;
    while (digit!=0) {

        product = x * (digit % 10); // Multiply by last digit
        arr[cnt] = product; // add to array
        cnt++; // increment count
        digit /= 10; // chop off last dig

    }

    for (int i=size-1; i>=0; i--) { // reverse the number to make it the right way
        //printf("%ld", arr[i]);
        sprintf(numberString, "%s%ld",numberString, arr[i]);
    }

        return atoi(numberString);
}

ループの外で使用すると正常に動作します。ただし、forループに入れようとすると、printfを含めない限り、SIGBARTエラーがスローされます。

これは機能します:

for (int i=1; i<10; i++) {
        x = concanatedProduct(12, i, 2);
        printf("%d\n", x);
    }

これはエラーをスローします:

for (int i=1; i<10; i++) {
        x = concanatedProduct(12, i, 2);
    }

一体何が起こっているのですか?それは私を完全に困惑させました。

4

2 に答える 2

3

最初の呼び出しでsprintf numberStringは初期化されないため、このような動作が発生します。

于 2012-05-27T06:12:46.493 に答える
1

C99標準のセクション7.19.6.6は、次のように述べています。

sprintf関数はfprintfと同等ですが、出力がストリームではなく配列(引数sで指定)に書き込まれる点が異なります。書き込まれた文字の最後にヌル文字が書き込まれます。戻り値の一部としてはカウントされません。オーバーラップするオブジェクト間でコピーが行われる場合、動作は定義されていません。

イタリック体の文は、numberStringが初期化されている場合でも、次の行を意味します。

sprintf(numberString, "%s%ld", numberString, arr[i]);

未定義の動作があります。

于 2012-05-27T11:22:46.660 に答える