0

公正な警告 — 私は C に非常に慣れていないため、予測できない動作がいくつかあります。これのトラブルシューティングを開始する方法がわかりません。

初期のオイラー問題の 1 つ (数値回文を扱うため) を解こうとしていますが、チェック関数に問題があります。数値aが に渡されるrev(a)と、すべてが正常に機能します。渡されるret(a)と(最終的に等価性、bool 型などをチェックする関数)、まったく間違った数値が返されます — メモリに関係があると思います。誰か助けてくれませんか?

#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機能した場合、これは運が良かっただけです (見方によっては、良いか悪いかのどちらかです)。初期化されていないメモリの内容を読み取ると、たまたまb0 に設定されているスタックを含め、何らかの影響を与える可能性があります。おそらく、プラットフォームまたはコンパイラのフラグを変更すると、問題が発生することに気付いたでしょう。

于 2013-05-14T14:49:46.790 に答える