0

文字を配列の添え字として使用しても問題ありませんか?

私の配列は 256 個のオブジェクトを保持するように初期化されているため、境界外へのアクセスは問題にならないようです。しかし、奇妙なセグメンテーション違反が発生していました。これは、読み取っていた文字の値が負の場合があることが原因であることがわかりました。

しかし、それがどのように可能かはわかりません。次に、それを unsigned char にキャストしましたが、それもうまくいきませんでした。そこでも境界の問題が発生しました。また、char 変数を int にキャストしてから配列にアクセスしようとしましたが、それでもセグメンテーションの問題がありました。

これを軽減するにはどうすればよいですか? 私のプログラムにはASCIIセットの各文字の配列セルがあるため、文字を介して配列にアクセスできることは素晴らしいことです。理にかなっているように見えますが、なぜ機能しないのかわかりません。

4

2 に答える 2

3

文字型の値を配列インデックスとして使用することは完全に有効です。配列インデックスは任意の整数型にすることができます。charunsigned char、およびsigned charはすべて整数型です。

ただし、プレーンcharは、実装に応じて、署名付きまたは未署名のいずれかになります。と同じ範囲signed charか、 と同じ範囲unsigned charです。いずれにせよ、それは依然として別個のタイプです。

したがって、256 要素の配列がある場合unsigned char、少なくとも 0 から 255 の範囲を持つ で安全にインデックスを付けることがcharできます。負の値を持つ可能性があるため、 で安全にインデックスを付けることはできません。

次に、それを unsigned char にキャストしましたが、それもうまくいきませんでした。そこでも境界の問題が発生しました。

これ以上の情報がなければ、どうすることもできません。

于 2012-07-30T05:50:52.057 に答える
0

unsigned char を使用すれば、問題の半分は解決するはずですが、注意が必要な境界の問題がもう 1 つあります。もう1つの問題は、配列内の要素の最大数を超えている要素にアクセスする可能性があることです。次に例を示します。

char myArray[256];
myArray[0]   = 0; // Works just fine
myArray[1]   = 0; // Works just fine
myArray[256] = 0; // Segfaults

プログラムが配列の範囲外 (0 ~ 255) の変数にアクセスしようとしているため、セグメンテーション違反が発生します。それがおそらくここで起こっていることですが、コードがないと確信が持てません。

于 2012-07-30T05:58:46.320 に答える