私は次のコードを持っています:
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 *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文字のポインターを割り当てています。
さて、
tc:6:警告:互換性のないポインタ型からの割り当て
メッセージはそれと関係があるかもしれません。
Cでは、'c'
は(小さい)整数です。char
それらをsとして。に保存しarr
ます。arr
ただし、としてアクセスすることにより、実際にedges[0]
はint *
(ほとんどのプラットフォームで)、、を整数として取得しarr[0]
てarr[1]
いますarr[2]
。arr[3]
edges[0]
要素が{(int)'cd'、0}のint配列として解釈されます(実際には、2番目の要素には任意のジャンクを含めることができます)。
指定子%cを持つprintfは、edges[0][0]
(つまり'c')の最初のバイトとedges[0][1]
(たまたま0であった)の最初のバイトを取ります。
タイプをedges
に変更しchar* edgeds[500]
ます。
3行目
edges[0] = arr;
割り当ての互換性のないタイプ:arr
はachar *
であり、edges[0]
はint *
です。
何が起こるかこれは:
int *edges[500];
char arr[] = {'c','d'};
arr[0]は'c'であり、arr[1]は'd'です。
edges[0] = arr;
int
タイプの互換性を無視すると、edges [0]は、「c」と「d」(および場合によってはさらに2つの未指定の文字)があるアドレスを指します。
printf("%c %c", edges[0][0],edges[0][1]);
edge [0] [0]は、edges [0]の最初の整数です。これは、「c」、「d」(および場合によってはさらに2つの未指定の文字)の組み合わせです。その値はunsignedcharに変換され、「c」が生成されて出力されます。
edge [0] [1]は、「c」、「d」(および場合によってはさらに2つの未指定の文字)が混在した直後の整数を指します。そのメモリ位置は初期化されておらず、プロセスがアクセスできる範囲外である可能性があります。
2文字の代わりにintを出力する場合
printf("%d\n", edges[0][0]);
'c'、'd'(および場合によっては2つの指定されていない文字)が混在していることがわかります。
最善の方法は、タイプを正しくすることです。
edges
intへのポインタの配列です。この式edges[0]
は、charへのポインターではなく、intへのポインターを生成します。これをchar配列として扱うと、誤ったバイトオフセットが計算され、char値'd'を保持しているメモリではなく、予期しないメモリの値が表示されます。
配列オフセットは、ポイントされたタイプのサイズに基づいて、オフセットをバイト単位で計算します。
foo_t * x;
ptrdiff_t difference = x[1] - x[0];
の値はバイトdifference
になります。は1と定義され、通常は4です。これは、コードが値をchar配列に1バイトではなく、char配列に間接参照することを意味します。sizeof(foo_t)
sizeof(char)
sizeof(int)