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类型不管怎么说,米列纽堡的回答清楚地表明了这一点。