1

私は次のコードを持っています:

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

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

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

4

6 に答える 6

7

intとはサイズが異なるので、char試してみてくださいchar *edges[500]

于 2009-10-19T15:23:49.740 に答える
3

型の不一致。edgesはintへの500個のポインターの配列であり、最初の要素に2文字のポインターを割り当てています。

于 2009-10-19T15:22:29.993 に答える
2

さて、

tc:6:警告:互換性のないポインタ型からの割り当て

メッセージはそれと関係があるかもしれません。

Cでは、'c'は(小さい)整数です。charそれらをsとして。に保存しarrます。arrただし、としてアクセスすることにより、実際にedges[0]int *(ほとんどのプラットフォームで)、、を整数として取得しarr[0]arr[1]いますarr[2]arr[3]

于 2009-10-19T15:21:24.597 に答える
2

edges[0]要素が{(int)'cd'、0}のint配列として解釈されます(実際には、2番目の要素には任意のジャンクを含めることができます)。

指定子%cを持つprintfは、edges[0][0](つまり'c')の最初のバイトとedges[0][1](たまたま0であった)の最初のバイトを取ります。

タイプをedgesに変更しchar* edgeds[500]ます。

于 2009-10-19T15:22:51.100 に答える
2

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つの指定されていない文字)が混在していることがわかります。

最善の方法は、タイプを正しくすることです。

于 2009-10-19T15:41:21.047 に答える
0

edgesintへのポインタの配列です。この式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)

于 2009-10-19T15:31:05.087 に答える