C 字符数组下标警告
在本例中使用字符数组下标时:C 字符数组下标警告,c,arrays,gcc,warnings,subscript,C,Arrays,Gcc,Warnings,Subscript,在本例中使用字符数组下标时: int main(){ char pos=0; int array[100]={}; for(pos=0;pos<100;pos++) printf("%i\n", array[pos]); return 0; } intmain(){ char pos=0; int数组[100]={}; 对于(pos=0;pos简单地说,它抱怨您的索引类型是字符 只需将pos转换为int,警告就会消失 至于出现此警告的原
int main(){
char pos=0;
int array[100]={};
for(pos=0;pos<100;pos++)
printf("%i\n", array[pos]);
return 0;
}
intmain(){
char pos=0;
int数组[100]={};
对于(pos=0;pos简单地说,它抱怨您的索引类型是字符
只需将pos
转换为int
,警告就会消失
至于出现此警告的原因,您已经说明过了。char
数据类型只能寻址0-255(如果无符号)甚至127(如果有符号)之间的值。对于普通数组,这是一个相当小的数字,您可能会很快忘记signed
位,并意外访问数组位置-128(通过实际访问数组元素128)
只要您的数组小于127,您就可以忽略警告,但老实说……内存占用中的这三个额外字节不会使应用程序效率低下,是吗?这是因为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
}
//根据字符的signedess,这将
//要么是正确的循环,
//或者无限循环,写满整个内存
字符数组[50+1];
对于(字符i=50;i>=0;i--)
{
_数组[i]=i;
//如果char是无符号的,则i变量永远不能小于0
//这将无限循环
}
因为本机字符可以是无符号的,也可以是有符号的
请注意,使用负下标是完全合法的。例如:
int arr[10];
int *ptr = arr[5];
现在我可以使用ptr[-1]
,它相当于arr[4]
。如果char
在实现中恰好是无符号的,它永远不会是负值。注意,你应该对数组元素使用size\u t
,而不是char
。啊,我现在看到了。感谢claryfiing。在循环中建立索引的好技巧。谢谢。@Mihalko,这不是技巧,这是警告;)这里的问题是,您正在比较循环中的char wuth=0
。数组索引是完全不相关的。那么为什么要对索引发出警告呢?它应该对比较发出警告,在某些机器上可能总是如此……是的,我知道为什么会有警告,但想知道为什么GCC只抱怨fot类型不管怎么说,米列纽堡的回答清楚地表明了这一点。