3

私は簡単な C プログラムを書きましたが、コンパイルに失敗することを期待していましたが、残念ながら C では正常にコンパイルおよび実行されますが、C++ ではコンパイルに失敗します。以下のプログラムを検討してください。

#include <stdio.h>
int main()
{
    char *c=333;
    int *i=333;
    long *l=333;
    float *f=333;
    double *d=333;
    printf("c = %u, c+1 = %u",c,c+1);
    return 0;
}

このリンクにアクセスしてください: http://ideone.com/vnKZnx

C++ の強力な型チェックのために、このプログラムは間違いなく C++ でコンパイルできないと思います。このプログラムが C でコンパイルされるのはなぜですか? コンパイラも警告を表示するのは事実です。Orwell Dev C++ IDE (gcc 4.8.1 コンパイラ) を使用しています。他のコンパイラ (Borland Turbo C++ 4.5) でも同じプログラムを試し、拡張子 .c で保存しましたが、このコンパイラではコンパイルに失敗しました。

4

3 に答える 3

5

C は数値をポインターに変換できます。メモリの 123 番目のバイトを指すようにchar* c = 123設定されます。c

これはほとんど役に立たず、デスクトップ プログラミングではほぼ間違いなくエラーですが、組み込みシステムでは、特定のハードコードされたメモリ アドレスで値を探す可能性があるハードウェアとのインターフェイスが必要です。

于 2014-09-08T13:25:19.720 に答える
-2

民族的に、コードに問題はありません。333. 整数定数値でポインターを初期化し、アドレスを出力します。表示される警告は、おそらく整数値がアドレス型にキャストされた型であるためです。

ポインターを逆参照しようとすると、問題が発生します。セグメンテーション違反が発生します。

于 2014-09-08T13:29:41.997 に答える