#include <stdio.h>
#define LENGTH_OF_A_MACRO 3
struct blahS
{
unsigned int groupsToTrace[LENGTH_OF_A_MACRO];
} blahS;
int main()
{
//Value hardcoded to 7 just for testing purpose. Otherwise value is assigned from another function
signed int trace = 7; //trace reads value of range [0-7] from a function
unsigned int ToTrace[LENGTH_OF_A_MACRO];
unsigned int number = 0;
unsigned int noOfGroups = 100;
if (trace != 0)
{
if ((trace == 1)) //b'001
{
ToTrace[number] = noOfGroups / 8;
number++;
}
if ((trace == 4)) //b'100
{
ToTrace[number] = noOfGroups / 2;
number++;
}
if ((trace == 7)) //b'111
{
ToTrace[number] = noOfGroups * 7 / 8;
number++;
}
}
struct blahS blah;
blah.groupsToTrace[LENGTH_OF_A_MACRO] = ToTrace[number]; //Compilation-error
return 0;
}
В основном это цикл if, который проверяет и принимает решение groupToTrace на основе битового отображения для выделенного значения трассировки. В последней строке я получил сообщение об ошибке компиляции: индекс массива 3 находится за концом массива. Я присваиваю вычисленные значения groupToTrace newPointer_p->groupsToTrace[3], где groupsToTrace[3] хранится в структуре
.Вопрос: Я получил ошибку компиляции, как упоминалось выше, с выходом за границы массива, насколько я понимаю. Но я не понимаю, где ошибка.
Версия компилятора gcc.x86_64 4.8.5-39.el7 @GSS-RHEL7
Любые подсказки или подсказки высоко ценятся. Заранее спасибо!
Когда вы создаете массив размером
3
, допустимыми индексами являются0
,1
и2
. Как говорит ошибка,blah.groupsToTrace[3]
находится за концом.Невозможно воспроизвести на той же версии gcc. Как именно вы компилируете?
Я не могу воспроизвести эту проблему ни на компиляторе onlinegdb. Но я вижу ошибку компиляции на своем рабочем месте. Я все еще думал, как это возможно. Когда я читаю код, я чувствую, что что-то выходит за пределы массива. Я понятия не имею об этом. @ 0x5453 Ты прав. Любая подсказка о том, как присвоить значение ToTrace[number] blah.groupsToTrace[LENGTH_OF_A_MACRO]?