除非包含printf(),否则C循环抛出错误?

时间:2012-05-27 05:46:06

标签: c printf

我在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);
    }

到底是怎么回事?这让我完全难过。

2 个答案:

答案 0 :(得分:3)

在您对sprintf numberString的第一次调用未初始化时,会导致此类行为。

答案 1 :(得分:1)

C99标准的第7.19.6.6节说:

  

sprintf函数等效于fprintf,输出除外   被写入数组(由参数s指定)而不是   一条小溪。空字符写在字符的末尾   书面;它不计入返回值的一部分。 如果复制   发生在重叠的对象之间,行为未定义。

斜体句意味着即使初始化numberString,行:

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

有未定义的行为。