Объявление глобальной структуры вызывает ошибку сегментации, но при локализации это нормально?

Как следует из названия, когда я объявляю структуру BasicSetup_S глобально, я получаю ошибку сегментации. Но если я перееду BasicSetup_S в CallFunction() ошибка сегментации исчезает.

Вывод правильный каждый раз. Он производит именно то, что я ожидаю увидеть, но я получаю ошибку сегментации. Но если я перееду BasicSetup_S структура внутри CallFunction ошибка сегментации исчезает. Есть ли причина, почему?

Я думаю, что вся моя программа может использовать слишком много памяти, вызывая ошибку, когда я объявляю больше глобальных переменных.

Для удобства чтения я упростил названия всего и показал только полезные части кода

#include <stdio.h>
#include "stdint.h"

typedef struct BasicSetup
{
    uint16_t A;
    uint16_t B;
    uint16_t C;
    uint16_t D;
    uint16_t E;
    uint16_t F[3];
    uint16_t G[7];
}BasicSetup;

BasicSetup BasicSetup_S = {
    // A,               // B,
    1,                  2,
    // C,               // D,
    3,                  4,
    // E,               // F[2],[1],[0]
    5,                    6 , 7 , 8,
    // G[6],[5],[4],[3],[2],[1],[0]
    9 , 10, 11, 12, 13, 14, 15,
};

void CallFunction(uint8_t *writeBuffer, int begAddress, int endAddress)
{
    int i;
    uint16_t tempVal;
    int StartingPoint = 0;

    for (i = begAddress; i < endAddress; i++)
    {
        // Grabs information from Device Information Structure
        if (i >= 0 && i <= 7)
        {
            // Grab Value
            tempVal = *((uint16_t*)&BasicSetup_S.A + i);
            // Send Value
            writeBuffer[(StartingPoint)++] = tempVal & 0xFF;
        }
        else if (i >= 13 && i <= 19)
        {
            // Grab Value
            tempVal = *((uint16_t*)&BasicSetup_S.G + i - 13);
            // Send Value
            writeBuffer[(StartingPoint)++] = tempVal & 0xFF;
        }
    }

    return;
}

int main(int argc, char *argv[]) {
    int numOfBytes = 0;
    int i = 0;
    uint8_t writeBuffer[256];

    CallFunction(writeBuffer, 0, 8);
    for (i = 0; i < 8; i++) printf("%d, ", writeBuffer[i]);
    printf("\n");

    CallFunction(writeBuffer, 13, 19);
    for (i = 0; i < 6; i++) printf("%d, ", writeBuffer[i]);
    printf("\n");

    CallFunction(writeBuffer, 19, 20);
    for (i = 0; i < 1; i++) printf("%d, ", writeBuffer[i]);
    printf("\n");

    return 0;
}

1 ответ

Поведение вашего кода не определено.

Вы не можете использовать арифметику указателя (неunsigned char типа), чтобы достичь других скалярных членов в struct, Что касается начинающих, вы предполагаете, что между участниками нет отступов.

Почему бы не использовать один массив вместо этого?

typedef struct BasicSetup
{
    uint16_t m[15];
} BasicSetup;

Стандарт C настаивает на том, что данные массива являются смежными, и тогда арифметика указателей будет совершенно четко определена.

Другие вопросы по тегам