2016-07-05 7 views
0

以下のプログラムでは、通常のint変数の場合、文字のデータが正しく印刷され、なぜデータがintで正しく印刷されないのですか?文字から整数ポインタへの変数格納がデータを正しく取得していない

ケース1

#include <stdio.h> 
int main() 
{ 
    int *i = NULL; 
    char s = 'A'; 
    i = (int *)&s; // storing 
    printf("i - %d\n",*i); 
    return 0; 
} 

出力:

i - 1837016897 

65値は、ここでは印刷されないのはなぜ?

ケース2

#include <stdio.h> 
int main() 
{ 
    int *i = NULL; 
    char s = 'A'; 
    i = (int *)&s; // storing 
    printf("i - %c\n",*i); // if we display character stored here 
          // then it is printed properly 
    return 0; 
} 

出力:

ケース3

#include <stdio.h> 
int main() 
{ 
    int i = 0; 
    char s = 'A'; 
    i = s; 
    printf("i - %d\n",i); // in this case data is properly printing 
    return 0; 
} 

出力:

i - 65 
+0

sizeof(int)とsizeof(char)は異なる値を返します。....... so ...... – LPs

答えて

3

intは4バイト、charは1バイトです。つまり、このように変換することはできません。あなたは1バイトの変数のポインタを取っており、プログラムに4バイトの変数のように解釈するように指示しているので、メモリの中にあるものはプログラム内で使用されます。これを進値で

1837016897は最後のバイト(0×41)は、実際に小数65で0x6D7EA741を、となり、それが最初の最後のバイトではなく、なぜあなたは迷っている場合は文字が(自分の結果に表示されませんエンディアンのためです - あなたが好きなら、それを自分で読むことができます)。

1
i = (int *)&s; 

これは確かI Sのアドレスを指しますが、sがcharあり、iを逆参照するとき、私はint*であることから、(*i)は、コンパイラがそう(*(char*)i)のようなキャストを使用しない限り、int型のためのように表示します。、それはSのアドレスに見えるが、charはに格納する1バイトのみを必要とする4バイトの代わりに、1(32ビットのintを想定)

1

intに見えるが、メモリに格納される4つのバイトを必要とするようメモリ。したがって、char s = 'A'は、メモリアドレス&sに値65の1バイトのみを格納します。

ケース1では、&sが指すメモリアドレスに4バイトを整数として出力しようとします。今度は&sに隣接するメモリにはガベージ値がある可能性がありますので、65ではなく1837016897となります。

ケース2では、%cを使用して印刷しており、iをcharにリキャストし、したがって1バイトしか印刷しません。

ケース3の場合、i=ssという値、つまりiに65を格納するため、出力として65が得られます。

3

のオブジェクトをintの左辺から参照するため、プログラム1と2はundefined behaviourと表示されます。これは、規格の第6.5項第7項によると認められていません。

printfのような関数に渡されると、は暗黙的にintに変換されるので、プログラム3は正常です。これは完全に正常であり、明確に定義されています。

+0

なぜ2がうまくいくのか、彼に説明する価値はあると思います。最初の1つはメモリ内の4バイト(3つはガーベッジ)を取っているために失敗し、その10進値を出力します。明らかに、これは未定義の結果をもたらす。しかし、最初のバイトを取得するだけです。これは、自分のシステムではバイトを格納することを決定したバイトです。これは、コンパイラが整数の中のどこにでもバイトを格納することができるため、彼のためにprintfによってつかまれたバイトは 'A'がそれに格納されたバイトだったからです。 – arduic

+0

それを言い換えると、コンパイラは、printコマンドで必要な整数のバイトを取得することを選択できます。このシステムは、彼が必要としていた通りに機能します。 – arduic

関連する問題