6

この例のように char 配列添え字を使用すると:

int main(){
    char pos=0;
    int array[100]={};

    for(pos=0;pos<100;pos++)
        printf("%i\n", array[pos]);

    return 0;
}

char 配列添え字を使用しているという警告が表示されます。

警告: 配列添字の型は 'char' [-Wchar-subscripts] です

この警告を有効にしているので、これで問題ありません。

GCCマニュアルは次のように述べています:

-Wchar-subscripts 配列の添え字が「char」型の場合に警告します。これは、一部のマシンでこのタイプが署名されていることをプログラマーが忘れがちであるため、エラーの一般的な原因です。この警告は -Wall によって有効になります。

したがって、この警告により、負の配列インデックスの使用が防止されるはずです。私の質問は、なぜこの警告が char でのみアクティブで、他の署名された型ではアクティブではないのですか?

ありがとうございました。

4

3 に答える 3

8

これは、intが常に署名されているためです。

charする必要はありません。

char実装に応じて、署名付きまたは未署名にすることができます。char( 、signed char、 の3 つの異なるタイプがありますunsigned char)

しかし、何が問題なのですか?0 から 127 までの値を使用できます。

ええ、できます。

//depending on signedess of char, this will
//either be correct loop,
//or loop infinitely and write all over the memory
char an_array[50+1];
for(char i = 50; i >= 0; i--)
{
    an_array[i] = i;
    // if char is unsigned, the i variable can be never < 0
    // and this will loop infinitely
}
于 2013-02-21T16:00:42.137 に答える
2

簡単に言えば、それはあなたのインデックスがタイプであることに不平を言っていますcharacter

に変換posするだけintで、警告が消えます。

この警告が表示される理由については、あなた自身が述べています。charデータ型は、0〜255(符号なしの場合)または127(符号付きの場合)の値のみをアドレス指定できます。通常の配列の場合、これはかなりわずかな数であり、ビットをすぐに忘れて、signed誤って配列の場所-128にアクセスする可能性があります(実際に配列要素128にアクセスすることによって)。

配列が127より小さい限り、問題はなく、警告は無視できますが、正直に言うと、メモリフットプリントにこれらの3バイトが追加されても、アプリケーションが非効率になることはありませんか?

于 2013-02-21T15:59:36.393 に答える
0

ネイティブcharは署名されていないか署名されている可能性があるためです。

負の添字を使用することは完全に合法であることに注意してください。例えば:

int arr[10];
int *ptr = arr[5];

ptr[-1]と同等の which を使用できるようになりましたarr[4]。実装で unsigned が発生した場合char、負の値になることはありません。

于 2013-11-11T02:48:21.933 に答える