uint64_t存入uint64_t**数组元素时值异常的问题求助
C语言内存管理器uint64_t赋值高32位被覆盖问题修复
问题核心
向uint64_t**类型的values数组元素存入不同宽度的整数值后,dump输出显示高32位被随机值覆盖,类型转换已验证无问题,问题集中在Memory结构体的values数组赋值环节。
常见原因及修复方案
1. 单个元素内存分配空间不足
如果为values数组的每个指针分配内存时,错误使用了32位类型的大小,会导致存储8字节的uint64_t时越界,高32位写入到未分配的内存区域,出现随机值。
错误代码:
memory->values[i] = malloc(sizeof(uint32_t)); // 仅分配4字节,不足以存储uint64_t
修复代码:
memory->values[i] = malloc(sizeof(uint64_t)); // 分配8字节,匹配uint64_t的宽度
2. 赋值时的强制类型转换截断数据
如果赋值时错误地将uint64_t值强制转换为32位类型后写入,会直接丢失高32位数据,后续读取时高32位会取到内存中的随机残留值。
错误代码:
*((uint32_t*)memory->values[i]) = (uint32_t)value; // 截断高32位
修复代码:
*memory->values[i] = (uint64_t)value; // 直接写入uint64_t类型的内存空间,保留完整8字节
3. values数组指针未正确初始化
如果values作为二维指针,仅初始化了指针数组本身,未为每个指针分配实际存储值的内存块,写入操作会访问野指针,导致内存乱码。
错误代码:
memory->values = malloc(sizeof(uint64_t*) * capacity); // 仅分配指针数组,未初始化每个元素 // 未对memory->values[i]执行malloc操作就直接赋值
修复代码:
memory->values = malloc(sizeof(uint64_t*) * capacity); for (int i = 0; i < capacity; i++) { memory->values[i] = malloc(sizeof(uint64_t)); // 为每个指针分配存储值的空间 *memory->values[i] = 0; // 可选:初始化默认值,避免随机残留 }
验证方法
dump输出时,确保以uint64_t类型完整打印值:
for (int i = 0; i < count; i++) { printf("values[%d] = 0x%016lx\n", i, *memory->values[i]); }
内容的提问来源于stack exchange,提问作者Kavindu Ravishka
相关产品推荐
相关产品推荐

