Объявление глобальной структуры вызывает ошибку сегментации, но при локализации это нормально?
Как следует из названия, когда я объявляю структуру 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 настаивает на том, что данные массива являются смежными, и тогда арифметика указателей будет совершенно четко определена.