2013-09-28 28 views
1

我在与下面的代码抛出的警告问题,希望你能帮助我:警告:数组下标是以上数组界限[-Warray界]

fprintf (fp, "%dd%d+%d ", pMobIndex->mana[DICE_NUMBER], 

DICE_NUMBER被定义我的头文件为0.

显然,0不会超过数组的大小。

该数组被定义为。

int    mana[2]; 

我完全不知道为什么会这样做,因为0显然在数组的范围内。我的一半引擎代码现在抛出这些数组绑定的错误,我已经得到了大约30个,而NONE对我来说是有意义的。

下面是使输出:

gcc -O3 -s -Wall -c -o obj/olc_save.o olc_save.c 
olc_save.c: In function 'save_mobile': 
olc_save.c:234:13: warning: array subscript is above array bounds [-Warray-bounds] 
    fprintf (fp, "%dd%d+%d ", pMobIndex->mana[DICE_NUMBER], 
     ^

也发生了:

db1.c: In function 'create_mobile': 
db1.c:2056:30: warning: array subscript is above array bounds [-Warray-bounds] 
      + pMobIndex->mana[DICE_BONUS]; 

olc_act.c: In function 'medit_manadice': 
olc_act.c:6500:15: warning: array subscript is above array bounds [-Warray-bounds] 
    pMob->mana[DICE_BONUS] = atoi (bonus); 

在我的头文件中的定义:

/* dice */ 
#define DICE_NUMBER 0 
#define DICE_TYPE 1 
#define DICE_BONUS 2 

我知道DICE_BONUS会(现在才意识到它),但我对于我的生活无法弄清楚为什么DICE_NUMBER是。

D'oh。问题是fprintf上的第三个整数输出是DICE_BONUS,但在另一行上,我认为编译器警告我关于DICE_NUMBER,它警告我关于BONUS。

+6

[SSCCE](http://sscce.org),或者它没有发生。 – jrok

+0

你确定警告是因为显示的代码? –

+0

更新到您自己的问题plz,而不是评论。 – billz

回答

3

mana[2]是两个元素的整数数组,而DICE_BONUS被定义为2因此mana[2]意味着您正试图访问第三个元素。

记忆阵列从0下标开始。因此所有与DICE_BONUS有关的警告都是有效的。您需要重新定义三个元素的数组。

现在约DICE_NUMBER这是不会导致警告。也许你在这条线上还有一些额外的论据,其中也包括DICE_BONUS

+0

事实上,考虑到他的格式字符串需要三个整数来显示像'4d6 + 1'这样的东西,所以'printf'函数调用的其余部分似乎可能包含'pMobIndex- >法力[DICE_BONUS]'继续。 – SirGuy