0

一个公平的警告——我对 C 非常陌生,并且有一些不可预测的行为。我不确定如何开始对此进行故障排除。

我正在尝试解决早期的欧拉问题之一(与数字回文有关),但我的检查功能遇到了问题。当一个数字a通过时rev(a),一切正常。当通过ret(a)(一个最终将检查相等性、布尔类型等的函数)时,它返回完全错误的数字——我认为这与内存有关。有人可以帮我吗?

#include <stdio.h>
#include <stdbool.h>

int rev(int a);
int check(int a);

main() {
    int a = 12;
    printf("%i ", a);
    printf("%i ", rev(a));
    printf("%i\n", ret(a));
}

int ret(int a){
    return rev(a);
}

int rev(int a){
    int b;
    while (a>0){
        b = (b*10) + a%10;
        a/=10;
    }
    return b;
}
4

1 回答 1

3

rev, 循环的第一次迭代

int b;
while (a>0){
    b = (b*10) + a%10;

对 的未初始化值进行操作b。这使得最终结果不可预测,几乎可以肯定是错误的。

修复很简单——你只需要初始化b为 0

int rev(int a){
    int b = 0;
    // function unchanged beyond this

如果调用rev对你有用,这只是运气(好或坏,取决于你如何看待它)。读取未初始化内存的内容可能会产生任何影响,包括b恰好设置为 0 的堆栈。您可能已经发现更改平台或编译器标志会导致事情中断。

于 2013-05-14T14:49:46.790 回答