#include <stdio.h>
#include <stdlib.h>
int factor(int n, int k, int v[], int *check){
int i=0;
if (n==1) {
*check=1;
return 1;
}
while (i<k && *check!=1){
if (n%v[i]==0) factor(n/v[i], k, v, check);
i++;
}
if (*check==1) return 1;
else return 0;
}
int fac(int n, int k, int v[]){
int check;
return factor(n,k,v,&check);
}
int main(){
int i,k, temp;
int P[2]={2,3};
int A[100];
for (i=1; i<20;i++) A[i]=0;
for (i=1; i<20;i++) {
temp=fac(i,2,P);
if(temp==1) {/*printf("%d ", temp);*/ A[i]=6; }
}
printf("\n");
for (i=1; i<20;i++) printf("%d ", A[i]);
return 1;
}
此函数找到整数&lt; 20,可以表示为2和3的乘积。因子和fac检查数字是否可以用这种方式表示;在主要中我以这种方式创建一个向量A:如果我不能以这种方式表达,则[i] = 0,否则A [i] = 6。问题是,如果我使用注释行程序正常,但如果我不使用它,A将只有6s。怎么可能(我认为它与因子函数中的指针参数相关,但我不确定)?
答案 0 :(得分:2)
这样的问题通常意味着某处存在未定义的行为。为了尽早发现问题,请始终在启用警告的情况下进行编译;例如如果您使用GCC,请始终提供至少-Wall
标记(并且-O3
通常有助于获取更多警告,因为编译器会更彻底地分析代码。)
E.g。这是我编译代码时的输出:
gcc -Wall -O3 my.c
my.c: In function ‘fac’:
my.c:19:7: warning: ‘check’ may be used uninitialized in this function [-Wmaybe-uninitialized]
int check;
^
因此,正如它指出的那样,变量check
未被初始化。我担心你的意图是始终用这个片段初始化它:
if (n==1) {
*check=1;
return 1;
}
但它不能以这种方式工作:下次调用fac
时,会有一个新的局部变量check
,并且它未被初始化。
我不确定代码中的逻辑是否正确,但修复此未定义的行为应该消除您观察到的“奇怪”错误。