我在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);
}
到底是怎么回事?这让我完全难过。
答案 0 :(得分:3)
在您对sprintf
numberString
的第一次调用未初始化时,会导致此类行为。
答案 1 :(得分:1)
C99标准的第7.19.6.6节说:
sprintf函数等效于fprintf,输出除外 被写入数组(由参数s指定)而不是 一条小溪。空字符写在字符的末尾 书面;它不计入返回值的一部分。 如果复制 发生在重叠的对象之间,行为未定义。
斜体句意味着即使初始化numberString
,行:
sprintf(numberString, "%s%ld", numberString, arr[i]);
有未定义的行为。