首页 > 解决方案 > 用数组中的数据填充结构

问题描述

我有一个包含原始数据的数组,其大小为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时,结构填充完成,但它不刷新值。

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

标签: cstructarmmalloc

解决方案


你有一个悬空指针:

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

在此之后 youf 全局变量LimitySenzoru指向被释放的内存位置。释放后,您将无法再访问此内存位置。否则你有未定义的行为

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

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


推荐阅读