c - 用数组中的数据填充结构
问题描述
我有一个包含原始数据的数组,其大小为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
时,结构填充完成,但它不刷新值。
任何想法,如何用原始数据填充结构?
解决方案
你有一个悬空指针:
/* fill structure by datas */
LimitySenzoru = (Plimits)set_limits;
/* free memory */
free(set_limits);
在此之后 youf 全局变量LimitySenzoru
指向被释放的内存位置。释放后,您将无法再访问此内存位置。否则你有未定义的行为。
从评论中,您似乎混合了一些概念。
您不会将任何数据填充到任何结构中。您只需复制一个指针。没有其他的。您要么需要保留分配的内存而不是free
它,要么需要分配内存LimitySenzoru
并执行一些操作memcpy
以将数据从一个结构填充到另一个结构中。
推荐阅读
- performance - 嵌套 While 循环大 O 。估计
- javascript - PHP if (isset) JavaScript 等价物
- android - Android Map GroundOverlay 不显示图像
- c - 如何链接特定的标头函数
- reactjs - 内联条件内的第二层条件语句反应
- angular - 如果 DOM 无论如何都将被删除,是否需要销毁 Angular 组件的 Dragula 实例?
- javascript - 如何使用 expressJS 处理 Fetch api formData 提交
- python - Pandas 中超过 2 列数据框的最大元素
- html - 宽度为 100vw 高度为 100vh 的画布必须有显示块
- android - Android Firebase CloudMessaging 在应用程序关闭时不加载 URL 它在单击时加载默认页面