如标题所建议的,当我全球声明结构BasicSetup_S
时,我会得到一个分段故障。但是,如果我将BasicSetup_S
移至CallFunction()
,则分段故障会消失。
每次输出都是正确的。它准确地产生了我期望看到的东西,但我得到了细分错误。但是,如果我在CallFunction
内移动BasicSetup_S
结构,则分割故障会消失。有什么原因?
我认为我的整个程序可能会在声明更多全局变量时使用过多的内存会导致故障。
为了易于阅读,我简化了所有内容的名称,仅显示代码的有用部分
#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;
}
您的代码行为不确定。
您不能使用指针算术(非unsigned char
类型的)在struct
中接触其他标量成员。对于Staters,您假设成员之间没有填充。
为什么不使用单个数组?
typedef struct BasicSetup
{
uint16_t m[15];
} BasicSetup;
C标准坚持认为数组数据是连续的,并且指针算术是完美定义的。