6

このコードは、一部の数値回文を正しく識別し、他の回文で失敗することにより、ランダムに失敗します。

#include <stdio.h>


int main(int argc, char *argv[])
{
   int n, reverse = 0, temp;

   printf("Enter a number to check if it is a palindrome or not\n");
   scanf("%d",&n);

   temp = n;

   while( temp != 0 )
   {
      reverse = reverse * 10;
      reverse = reverse + temp%10;
      temp = temp/10;
   }

   if ( n == reverse )
      printf("%d is a palindrome number.\n", n);
   else
      printf("%d is not a palindrome number.\n", n);

   return 0;
}

たとえば、上記のコードは、「87678」は回文数ではないと誤って述べています。

の戻り値を確認するscanf()と、成功したことが示され、 の値nが 87678 の入力に対して正しいことが表示されます。

ただし、コードは「4554」が回文であることを正しく示しています。

ただし、以下を追加することにより:

n = reverse = temp = 0;

最初printf()のプログラムが常に正しく動作しているように見える前に。では、最初のバージョンでは何が起こっているのでしょうか? 変数が使用前に初期化されていない場合、これはある種の未定義の動作ですか?

編集:コンパイラが何をしているかを確認できないコンパイル済みバージョンのアセンブリを後で提供します。

4

3 に答える 3

4

sizeof(int)が 4 未満でない限り、コンパイラのバグに遭遇したか、ハードウェアが誤動作しているか、システムで何らかの形のデータ破損が発生しています。

質問に答えるには: いいえ、プログラムのどこにも未定義の動作scanf()はありません (実際に失敗しないと仮定して)。

システムで memtest を実行して、RAM の問題を除外してみてください: http://www.memtest.org

于 2012-10-29T09:50:24.327 に答える
2

これは gcc の新しいバージョンで動作するため、コンパイラ エラーがあるように思えます。gcc -S (pastebin してください?) の出力と、使用しているコンパイル コマンドを知りたいです。(特に最適化レベル)。

于 2012-10-29T09:56:25.253 に答える
-3

Java とは異なり、C には int のデフォルト値がありません。この同様の問題について説明しているので、この投稿を参照できます。

于 2012-10-29T09:20:21.467 に答える