字符数组下标警告
当我使用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
可以是签名的或未签名的,具体取决于实现。 (有三种不同的类型 – char
, signed char
, 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 }
简单地说,它抱怨你的索引是类型character
。
只需将pos
转换为int
,警告就会消失。
至于为什么出现这个警告,你自己就说过了。 char
数据类型只能寻址0到255(如果是无符号)或甚至只有127(如果是有符号)的值。 对于普通数组,这是一个相当微弱的数字,你可以很快忘记有signed
位并意外地访问数组位置-128(通过实际访问数组元素128)。
只要你的数组小于127,你就可以了,你可以忽略警告,但说实话……你的内存占用中的这三个额外字节不会使你的应用程序效率低下,是吗?
因为本机char
可以是未签名的或签名的。
请注意,使用负下标是完全合法的。 例如:
int arr[10]; int *ptr = arr[5];
现在我可以使用ptr[-1]
,这相当于arr[4]
。 如果char
在实现中恰好是无符号的,那么它永远不会是负值。