我有一个数组,其原始数据的大小为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
时,结构填充已完成,但是不会刷新值。
任何想法,如何用原始数据填充结构?
答案 0 :(得分:0)
您有一个悬空的指针:
/* fill structure by datas */
LimitySenzoru = (Plimits)set_limits;
/* free memory */
free(set_limits);
此后,全局变量LimitySenzoru
指向已释放的内存位置。释放后,您将无法再访问该存储位置。否则,您会有未定义的行为。
在评论中,您似乎混合了一些概念。
您不将任何数据填充到任何结构中。您只需复制一个指针。没有其他的。
您要么需要保留分配的内存而不是free
,要么需要为LimitySenzoru
分配内存,然后执行一些memcpy
来将数据从一个结构填充到另一个结构中。