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 循环时,它会引发 SIGBART 错误,除非我包含 printf。

这有效:

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 回答