2013-02-21 11 views
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-添字が警告し 。これは、プログラマがこのタイプが一部のマシンで署名されていることをしばしば忘れるため、一般的なエラーの原因です。この警告は、-Wallによって有効になります。

この警告は負の配列インデックスを使用しないようにする必要があります。私の質問は、なぜこの警告はcharだけで、他の署名された型でもアクティブではないということです。

ありがとうございます。

+0

'char'ではなく、配列要素に' size_t'を使うべきです。 – netcoder

答えて

8

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

charはありません。

charは、実装によっては署名付きまたは署名なしにすることができます。 (ある三つの異なる種類 - charsigned charunsigned 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 
} 
+0

ああ、私は今それを見る。ありがとうございました。サイクルでのインデックス作成のヒントありがとう。 – Mihalko

+0

@Mihalkoよく、それはヒントではありません、それは警告です;) – milleniumbug

+1

ここでの問題は、ループ内のchar wuth '> = 0'を比較していることです。配列のインデックス付けは完全に無関係です。だからなぜインデックスについての警告を出すのですか?それは、いくつかのマシンで常に真実かもしれない比較について警告する必要があります... –

2

あなたのインデックスがタイプcharacterであると不平を言っています。

posintに変換するだけで警告が表示されなくなります。

この警告が表示される理由については、あなた自身で述べています。 charデータ型は、0〜255(符号なしの場合)または127(符号付きの場合)の値のみを扱うことができます。通常の配列では、それほど貧弱な数であり、signedビットを忘れてしまい、誤って配列位置-128にアクセスしてしまいます(実際に配列要素128にアクセスすることによって)。

配列が127より小さい場合は、警告は無視しても問題ありませんが、正直なことですが、メモリフットプリントの3つの余分なバイトがアプリケーションを非効率的にすることはありません。それ?

+0

はい、私はなぜそこに警告があるのか​​知っていますが、なぜGCCがタイプcharを告げるのか不思議に思っていました。とにかくmileniumbugの答えが明らかになった。 – Mihalko

0

ネイティブcharは、符号なしまたは署名のいずれかになりますので。

負の添え字を使用するのが最適です。例えば:

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

は今、私はarr[4]に相当するptr[-1]を使用することができます。 charがインプリメンテーションで符号なしである場合は、負の値になることはありません。

関連する問題