1
#include<stdio.h>
#include<stdlib.h>
int main( int argc ,char** argv) {
    int bugs = 100;
    char nul_byte='\0';
    char care_percentage = bugs * nul_byte;
    printf("Which means you should care %s%%.\n",care_percentage);// 1->prints (null)
    printf("Which means you should care %d%%.\n",care_percentage);// 2->prints 0
    printf("Which means you should care %c%%.\n",care_percentage);// 3->prints 
    return 0;
}

問題は、最後の 3 つのステートメント 1、2、および 3 で実際に何が起こるかです。マシン レベルで内部的に何が起こるかです。印刷中に %s が (null) と見なされ、%d が 0 と見なされ、%c が何もないと見なされる方法。

誰かがマシンレベルの深さでこれらを説明できますか?

4

1 に答える 1

6

まず第一に、これは「マシンレベル」とは関係ありません。ここでのすべては、ランタイムで、またはより具体的には の実装で発生しますprintf()。さらに、間違ったフォーマット指定子を使用して発生するすべての「変換」は、潜在的に問題を探しています。パラメータをフォーマット指定子の正しいタイプに変更します。

まず計算:

  • bugsに設定されてい100ます。
  • nul_byte0( の実際の値\0) に設定されます。
  • care_percentage本質的に解決する100 * 0、これは0再びになります。

それで、何が起こるのですか?

最初のケース:これは特別なケースであり、必ずしもそうすることに依存するわけではありません。基本的に、格納されている文字列にアクセスしています0x00000000(これは無効な場所です。恐ろしい NULL ポインターです)。それがキャッチされたのは幸運です (実際に定義された動作だとは思わないでください。ただし、私が間違っていることを自由に証明してください)。

2 番目のケース:渡された値は整数として読み取られるため、0 です。これが実際の値であるためです (そこで (ポインター) キャストが行われていると想像してください)。

3 番目のケース:渡された値は文字として読み取られ、文字列に直接挿入されないため、特殊なケースがトリガーされます\0

于 2013-08-03T09:04:58.533 に答える