用数组中的数据填充结构

时间:2018-07-25 09:46:32

标签: c struct arm malloc

我有一个数组,其原始数据的大小为64 bytes

#define SIZE_OF_LIMITS_STRUCTURE 64
uint32_t *set_limits = (uint32_t *)malloc(SIZE_OF_LIMITS_STRUCTURE);

我用内存中的实际数据填充该数组。


我有一个结构(结构的大小为64 bytes

typedef struct {
    uint8_t A
    uint8_t B
    uint8_t C
    uint8_t D
    uint8_t E
    uint8_t F
    uint8_t G
    uint8_t H
    uint16_t I
    uint16_t J
    uint16_t K
    uint16_t L
    uint16_t M
    uint16_t N
    uint16_t O
    uint16_t P
    uint16_t Q
    uint16_t R
    uint16_t S
    uint16_t T
    uint16_t U
    uint16_t V
    uint16_t W
    uint16_t X
    uint16_t Y
    uint16_t Z
    uint16_t AA
    uint16_t BB
    uint16_t CC
    uint16_t DD
    uint16_t EE
    uint16_t FF
    uint16_t GG
    uint16_t HH
    uint16_t II
    uint16_t JJ
} __attribute__ ((packed)) Limits,  *Plimits;

我需要使用数组中的数据更新此结构中的值:

LimitySenzoru = (Plimits)set_limits;

该函数是错误的。而且我不知道为什么。


这是填写结构的完整功能:

volatile Plimits LimitySenzoru = NULL;

void update_structure(void)
{
    uint32_t *set_limits = (uint32_t *)malloc(SIZE_OF_LIMITS_STRUCTURE);
    uint32_t addr = ADDRESS_OF_LIMITS_IN_MEM;
    uint32_t test[] = {0};

    for(uint8_t i = 0; i < SIZE_OF_LIMITS_STRUCTURE/4; ++i)
    {
        Read_from_memory_32(addr, test); //read datas from memory to array
        set_limits[i] = test[0];
        addr += 4;
    }

    /* fill structure by datas */
    LimitySenzoru = (Plimits)set_limits;

    /* free memory */
    free(set_limits);
}

当我用数据填充结构并打印时:

datas = [4, 8, 18, 21, 0, 5, 30, 31, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 92, 94, 99, 101, 104, 109, 113, 119, 125, 126, 128, 129, 132, 134, 135, 137, 138, 141, 150, 151, 153, 159, 161, 167, 169, 170, 178, 179, 183, 187, 195, 197, 204, 206, 207, 208, 213, 218, 223, 230, 240, 248]

The first 4 values (A, B, C, D)0。 当我禁用free时,结构填充已完成,但是不会刷新值。

任何想法,如何用原始数据填充结构?

1 个答案:

答案 0 :(得分:0)

您有一个悬空的指针:

/* fill structure by datas */
LimitySenzoru = (Plimits)set_limits;
/* free memory */
free(set_limits);

此后,全局变量LimitySenzoru指向已释放的内存位置。释放后,您将无法再访问该存储位置。否则,您会有未定义的行为

在评论中,您似乎混合了一些概念。

将任何数据填充到任何结构中。您只需复制一个指针。没有其他的。 您要么需要保留分配的内存而不是free,要么需要为LimitySenzoru分配内存,然后执行一些memcpy来将数据从一个结构填充到另一个结构中。