質問
次のコードがあります:
int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);
表示させたいのは c - d
しかし、実際に表示されているのは c -
上でわかるように、最初の要素は表示されますが、2 番目の要素は表示されません。
配列の 2 番目の要素が表示されないのはなぜですか?
解決
int
とchar
は異なるサイズを持っているので、あなたがchar *edges[500]
他のヒント
型が一致しません。 edges
はint型への500個のポインタの配列であり、あなたは、その最初の要素には、2つの文字へのポインタを割り当てています。
さて、
t.c:6: warning: assignment from incompatible pointer type
メッセージはそれとは何かを持っているかもしれません。
はCで、'c'
は(小さい)の整数です。あなたはchar
でarr
sとしてそれらを格納します。しかし、整数として、あなたが実際に(ほとんどのプラットフォーム上で)arr
取得しているされてedges[0]
int *
、arr[0]
、arr[1]
とarr[2]
としてarr[3]
にアクセスしてます。
edges[0]
、要素{(INT) 'CD'、0}(実際には、2番目の要素は、任意のジャンクを含むことができる)とint配列として解釈されます。
のprintfと指定子%cはedges[0][0]
の最初のバイト(すなわち 'C')と(0に起こった)edges[0][1]
の最初のバイトを取る。
edges
にchar* edgeds[500]
の変化型ます。
3行目
edges[0] = arr;
割り当て内の互換性のない型: arr
です char *
そして edges[0]
です int *
.
何が起こるか、これは:
int *edges[500];
char arr[] = {'c','d'};
arr[0] は「c」、arr[1] は「d」です
edges[0] = arr;
型の互換性を無視すると、edges[0] は int
「c」と「d」(および場合によってはさらに 2 つの不特定の文字)が存在するアドレス。
printf("%c %c", edges[0][0],edges[0][1]);
edges[0][0] は、edges[0] の最初の整数です。これは、「c」と「d」(およびさらに 2 つの不特定の文字)を組み合わせたものです。その値は unsigned char に変換され、「c」が生成され、出力されます。
edges[0][1] は、'c'、'd' (および場合によってはさらに 2 つの不特定の文字) を組み合わせた直後の整数を指します。そのメモリの場所は初期化されておらず、プロセスがアクセスできる範囲外にある可能性があります。
2 文字の代わりに int を出力する場合
printf("%d\n", edges[0][0]);
「c」、「d」(およびおそらく不特定の 2 つの文字)が混在していることがわかります。
一番良いのは、タイプを正しく理解することです。
edges
はint型へのポインタの配列です。表現edges[0]
はintへのポインタではなく、char型へのポインタを生成します。 char配列としてそれを処理してchar値「d」を保持するメモリではなく、表示されるメモリの予想外の部分の値を発生させる、計算されるオフセット誤ったバイトを引き起こす。
アレイオフセットタイプの大きさに基づいて、バイト単位のオフセットを計算指さ
foo_t * x;
ptrdiff_t difference = x[1] - x[0];
difference
の値はsizeof(foo_t)
バイトであろう。 sizeof(char)
は1であると定義され、sizeof(int)
は、典型的には4であり、コードがchar配列にchar配列ではなく、1バイトに値4つのバイトを逆参照することを意味している。