2016-11-18 3 views
0

short(合計4バイト)のメモリが割り当てられたarrアレイがあります。それから、私はffffeeeeに応じてこれらの2つの要素を埋めます。私が4に割り当てられたのと同じ割り当てられたメモリを反復しようとした後char(合計で4バイト、しかし今は1バイトで要素を調べることができると思います)出力からわかるように、私は何を期待しているのかわかりません(同じ0xeeeeffffを4つの別々の要素に分割してください)。コードの何が間違っていますか?配列を反復処理して要素を異なる型として解釈する方法は?

short *arr = malloc(sizeof(short) * 2); 
    *arr = 0xeeee; 
    *(arr + 1) = 0xffff; 
    printf("%p\n", &arr[0]); 
    printf("%p\n", &arr[1]); 
    // convert 
    char * cnv = (char *)arr; 
    printf("=======\n"); 
    for (int i = 0; i < 4; i++) { 
    printf("%p\n", cnv); 
    printf("%x\n", *cnv); 
    cnv++; 
    } 

出力:

0x759010 
0x759012 
======= 
0x759010 
ffffffee # expect 'ee' 
0x759011 
ffffffee # expect 'ee' 
0x759012 
ffffffff # expect 'ff' 
0x759013 
ffffffff # expect 'ff' 
+1

'short'と' char'はprintfに '...'を介して渡され、 'int'sとして渡されます。それが '...'の仕組みです。 ''%hhx "'を使用して、 'int'をcharと解釈する必要があります(とにかくgccで)。 – Arkadiy

答えて

1

%xunsigned int、ないchar期待し、したがって、あなたのプログラムの動作は未定義ました。 %hhxが必要です。

+1

なぜいくつかの修正を加えたデモ –

+0

ここでは、(printf( "%p \ n"、(void *)) &arr [0]); '? –

+0

@TimurFayzrakhmanov:それが 'printf'の働きだからです。元のコードには未定義の動作があります。マニュアルを参照してください。 –

2

charは、ご使用のプラットフォーム上でタイプを締結しているようです。 16進数0xeeは負数(-18)として扱われます。その数値が整数に昇格されると、それは16進数で0xffffffeeであるようなバイナリ表現です。

0xffでも同じことが起こります。

%dを使用して印刷すると、出力に負の値が表示されます。

printf("%x %d\n", *cnv, *cnv); 
関連する問題