質問

次のコードがあります:

int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);

表示させたいのは c - d しかし、実際に表示されているのは c -
上でわかるように、最初の要素は表示されますが、2 番目の要素は表示されません。

配列の 2 番目の要素が表示されないのはなぜですか?

役に立ちましたか?

解決

intcharは異なるサイズを持っているので、あなたがchar *edges[500]

を試してみてください

他のヒント

型が一致しません。 edgesはint型への500個のポインタの配列であり、あなたは、その最初の要素には、2つの文字へのポインタを割り当てています。

さて、

t.c:6: warning: assignment from incompatible pointer type

メッセージはそれとは何かを持っているかもしれません。

はCで、'c'は(小さい)の整数です。あなたはchararrsとしてそれらを格納します。しかし、整数として、あなたが実際に(ほとんどのプラットフォーム上で)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]の最初のバイトを取る。

edgeschar* 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つのバイトを逆参照することを意味している。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top