gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:05 26 4
gpt4 key购买 nike

#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;
}

这个函数找到小于 20 的整数,可以表示为 2 和 3 的乘积。factor 和 fac 检查数字是否可以用这种方式表示;主要是我以这种方式创建一个 vector A:如果我不能以这种方式表达,则 A[i]=0,否则 A[i]=6。问题是如果我使用注释行程序运行正常,但如果我不使用它,A 将只由 6 组成。这怎么可能(我认为它与因子函数中的指针参数有关,但我不确定)?

最佳答案

像这样的问题通常意味着某处存在未定义的行为。为了及早发现问题,请始终在启用警告的情况下进行编译;例如如果您使用 GCC,请始终至少提供 -Wall 标志(并且 -O3 通常有助于获得更多警告,因为编译器会更彻底地分析代码)。

例如这是我编译你的代码时的输出:

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,并且它没有被初始化。

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

关于c - 奇怪的错误(程序只有在我打印时才能正常工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43416412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com