プログラム/アプリケーションは、メモリアドレスのデータが特定のデータ型であることをどのように知っていますか?Cのメモリ内の値のデータ型を識別しますか?
たとえば、int a;
があり、変数a
がアドレス0x100
に格納されているとします。タイプがint
であることを示す情報はどこに格納されていますか?
プログラム/アプリケーションは、メモリアドレスのデータが特定のデータ型であることをどのように知っていますか?Cのメモリ内の値のデータ型を識別しますか?
たとえば、int a;
があり、変数a
がアドレス0x100
に格納されているとします。タイプがint
であることを示す情報はどこに格納されていますか?
Cのような言語では、情報は常にを解釈する方法で "格納されます" です。コンパイラによっていくつかのニッセンが追加されています。これは、ある程度、変数の型を理解し、意味をなさない操作を防止しようとします。
たとえば、ビット:0xFFFFFFFF
があるとします。それらを "a 32b unsigned int"と解釈すると、4294967295
が得られます。それらを「32b signed int」と解釈すると、-1
(*)となります。それらをダブルと解釈すると、神はあなたが得るものを知っています。
"あなたがそれらをダブルと解釈すると、神はあなたが得るものを知っています。"問題は、通常。 「ダブル」は64ビットになる傾向があります。 'float'と解釈すると、IEEE754を使うとNaNになります。 –
ここでは、コードでは想定していません。
他の言語(C++)には、オブジェクト型に関する情報の一部を含むvtableとの動的バインディングというものがあることに注意することが重要です。 – Mikhail
@Mishaこの質問はCについてのものなので、私はこの情報を追加していません。 – heinrich5991
Cプログラムが過去のリンクであり、シンボルを外部に公開する必要がない場合、このデータはもはや存在しません。
データ型は言語に関連しています。実行可能ファイルが準備できたら、その言語はもうメモリとプロセッサーなので、もう再生できません。
Cアプリケーションにはタイプ情報は保存されません。唯一の強制は、データの使用方法です。そして、Cでは、その執行を乱用することは非常に単純な問題です。
は、次の点を考慮してください
short s;
short *p = &s;
*(long*)p = 0;
このコードは短い変数へのポインタを取り、それは長いあたかもその変数に書き込みます。これにより、使用されている変数が所有するものを超えてメモリが上書きされ、未定義の動作が発生します。
おそらく '*(long *)&s'を意味するでしょうか? – asaelr
おっと!うん、固定。 –
UBの右側にあります( '(long)p'は整列されません)。この例では、スイッチを短く長くしてください。 –
この情報は保存されていません。たとえば、あなたは何かすることができます
int i=15;
char *p=(char*)&i;
char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0
あなたが本当に何をしているのか分からない限り、これをしないでください。これほどうまくいけないことは、エラーの一般的な方法です。
これはなぜ間違っていますか? printf( "%c"、c)を実行するとどうなりますか? –
@SharatChandraあなたが何をしているのか分かっていれば大丈夫です。誰かがそれを知らず、そのようなことを知らなければ、それは通常ナンセンスです。 –
@SharatChandraダニエル氏は書いていますが、あなたが何をしているのか分かっていればいいですが、この単純な例でも 'c'は0または15です。もっと複雑なケースでは、アラインメントについても注意する必要があります。 – asaelr
また、[この複製](http://stackoverflow.com/questions/39206296/how-does-memory-det-data-type-of-variable)も参考にしてください。 –