【问题标题】:printf() changing treatment of variable in Cprintf() 改变 C 中变量的处理方式
【发布时间】:2023-03-16 12:15:01
【问题描述】:

我的程序中有一个非常简单的函数,它使用割线方法来查找函数的根。它适用于下面所示的 printf()。但是如果我把它注释掉,循环就会无休止地重复。我不知道为什么...

我已经阅读了有关 printf 更改变量的信息,但我没有看到任何内容更改了变量的存储。我错过了什么吗?打印它不是一个很好的解决方案,因为迭代并不重要,而且函数被调用了数百万次。

double guess1=500.;
double y1=estimater(r,volume,guess1,adm,tm,rr[r]);
double guess2=adm/30.;
double y2=estimater(r,volume,guess2,adm,tm,rr[r]);
int i;
double guess3=0.;
double y3;
double tol =heightTOL;
int secmax=SECANTMAX;
for(i=1;i<=secmax;i++){
    guess3=guess2-y2*(guess2-guess1)/(y2-y1);
    if(guess3>adm/2.){
        guess3=adm/2.;
    }
    if(guess3<=0.){
        guess3=0.;
    }
    y3=estimater(r,volume,guess3,adm,tm,rr[r]);
    y1=y2;
    y2=y3;
    guess1=guess2;
    guess2=guess3;
    if(fabs(guess2-guess1)<tol){
        break;
    }
    if(i==secmax){
        printf("\nRan out of iterations in height finder\n");
    }
    printf("%d     %f",i,guess3); //THIS ONE HERE!!!!!!!!
}
return guess3;

【问题讨论】:

  • 您可能在某处调用了未定义的行为。你能构造一个我们可以编译和运行的minimal test-case吗?
  • 我最好的猜测:你在数组边界之外写,rr[r] 是我看到的唯一候选对象,它会覆盖i,因此i == secmax 永远不会变为真,除非调用printf 会导致布局更改,将i 移动到它还没有(尚未)踩到的地方。
  • 你在调试器中运行过这个吗?或者如果你在 linux 上,通过 valgrind 来检查内存错误?

标签: c variables loops printf


【解决方案1】:

printf 根本不会更改您的数据。 printf 系列函数对您的数据产生任何影响的唯一方法是,如果您使用 %n 格式说明符(它写入您传递地址的变量),或者您正在做一些调用未定义行为的事情,就像传递错误的格式参数一样。你没有在这里做任何事情(你的格式字符串是正确的),所以你的错误在别处。

检查您的所有数组访问是否在界限内。尝试在 Valgrind 或其他验证器中运行您的代码以尝试查找内存错误。

【讨论】:

    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多