2017-11-05 21 views
0

ここで私はこのプログラムで何が実際に起こっているのか知りたいです。ここでポインタはcharタイプであり、var1は整数タイプです。char型のint型データのアドレスを格納するポインタ

#include<stdio.h> 
void main() 
{ 
    char *ptr; 
    int var1; 
    ptr=&var1; 
    *ptr=495; 
    printf("\n%d %c",var1,var1); 
    *ptr='495'; 
    printf("\n%d %c",var1,var1); 
} 

私はこのプログラムを実行しようとしたとき、これらは私が理解していない

v.c:6:4: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] 
ptr=&var1; 
    ^
v.c:7:6: warning: overflow in implicit constant conversion [-Woverflow] 
*ptr=495; 
    ^
v.c:9:6: warning: multi-character character constant [-Wmultichar] 
*ptr='495'; 
    ^
v.c:9:6: warning: overflow in implicit constant conversion [-Woverflow] 

そして

ここ
239 � 

53 5 

は - このプログラムの出力をgot-警告ですそれはなぜデータがオーバーフローしているのかということです。

ポインタとしてプログ

の私の分析では、文字型であり、charのサイズとして1バイトなので、ポインタのみvar1のベースアドレスを指します。したがって、var1の最初のバイトに格納された値が出力になります。他の3バイトはポインタによってアクセスされない。

239がvar1の最初のバイトに格納されていると思います。%cはASCII値が495でない文字を意味するため、 が印刷されています。

そして、printf 495は文字定数です。しかし、53と5が印刷されます。

わかりません。助けてください。ありがとうございました!

+1

'var1'は' int'です。そのアドレスは 'char *'ではなく 'int *'型です。互換性のあるアドレスが必要な場合は、 'char'と宣言する必要があります。そして、 '' 495 ''は文字定数としては意味がありません。少なくとも' char'に代入するのではないです。 –

+0

* ptr = '495';定義されていない動作です...コンパイラに依存しているので、コンパイラは '495'から '5'しか取らず、* ptrに代入しているようです。 – Varun

+0

実際には、int型データのアドレスをcharポインタに格納するとどうなるかを実験しようとしています。 – SGG

答えて

0

文字ポインタを使用して整数変数を参照しようとしています。

ポインタ宣言では、どのデータ型を指し示すべきかを知る必要があります。逆参照する際に必要となるためです。 (メモリから読み込むデータの量はどれくらいですか?)

ここでは、ポインタが1バイト(char)を指し、実際に整数(4または2バイト)を指し示していることをコンパイラに伝えています。したがって、エラー。また、 '495'は複数文字列です。

関連する問題