奇怪的错误(该程序只有在我打印时才能正常工作)

时间:2017-04-14 17:34:57

标签: c

#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。怎么可能(我认为它与因子函数中的指针参数相关,但我不确定)?

1 个答案:

答案 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,并且它未被初始化。

我不确定代码中的逻辑是否正确,但修复此未定义的行为应该消除您观察到的“奇怪”错误。