C-宣布全球结构会导致分割故障,但是当局部定位时



如标题所建议的,当我全球声明结构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标准坚持认为数组数据是连续的,并且指针算术是完美定义的。

相关内容

  • 没有找到相关文章

最新更新