Ошибка компиляции — индекс массива находится за концом массива blah.groupsToTrace[LENGTH_OF_A_MACRO] = ToTrace[number];

avatar
revanth
1 июля 2021 в 18:22
44
1
0

#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

Любые подсказки или подсказки высоко ценятся. Заранее спасибо!

Источник
0x5453
1 июля 2021 в 18:29
2

Когда вы создаете массив размером 3, допустимыми индексами являются 0, 1 и 2. Как говорит ошибка, blah.groupsToTrace[3] находится за концом.

dbush
1 июля 2021 в 18:32
0

Невозможно воспроизвести на той же версии gcc. Как именно вы компилируете?

revanth
1 июля 2021 в 18:40
0

Я не могу воспроизвести эту проблему ни на компиляторе onlinegdb. Но я вижу ошибку компиляции на своем рабочем месте. Я все еще думал, как это возможно. Когда я читаю код, я чувствую, что что-то выходит за пределы массива. Я понятия не имею об этом. @ 0x5453 Ты прав. Любая подсказка о том, как присвоить значение ToTrace[number] blah.groupsToTrace[LENGTH_OF_A_MACRO]?

Ответы (1)

avatar
dbush
1 июля 2021 в 18:38
0

Похоже, вы неправильно понимаете, что делает эта строка:

blah.groupsToTrace[LENGTH_OF_A_MACRO] = ToTrace[number]; 

Это не копирование всего содержимого одного массива в другой. Он копирует индекс number из ToTrace в индекс LENGTH_OF_A_MACRO из blah.groupsToTrace. Оба этих индекса имеют значение 3, которое находится за пределами обоих массивов, поскольку массив размера 3 имеет индексы 0, 1 и 2.

Вам нужен цикл для копирования элементов:

int i;
for (i=0; i<number; i++) {
    blah.groupsToTrace[i] = ToTrace[i];
}

Или вы можете использовать memcpy:

memcpy(blah.groupsToTrace, ToTrace, sizeof(blah.groupsToTrace));
revanth
1 июля 2021 в 19:15
0

В порядке. Я думаю, что я полностью увлекся. Цикл for — это классический способ объяснить метод копирования индекса в индекс. Но я выберу memcpy из-за меньшего времени на компиляцию. Спасибо за отличный вход товарищ!