字符数组下标警告

当我使用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上激活而在其他签名类型上也没有?

谢谢。

这是因为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 } 

简单地说,它抱怨你的索引是类型character

只需将pos转换为int ,警告就会消失。

至于为什么出现这个警告,你自己就说过了。 char数据类型只能寻址0到255(如果是无符号)或甚至只有127(如果是有符号)的值。 对于普通数组,这是一个相当微弱的数字,你可以很快忘记有signed位并意外地访问数组位置-128(通过实际访问数组元素128)。

只要你的数组小于127,你就可以了,你可以忽略警告,但说实话……你的内存占用中的这三个额外字节不会使你的应用程序效率低下,是吗?

因为本机char可以是未签名的或签名的。

请注意,使用负下标是完全合法的。 例如:

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

现在我可以使用ptr[-1] ,这相当于arr[4] 。 如果char在实现中恰好是无符号的,那么它永远不会是负值。