写入 int 与 uint16_t 时的内存填充
Memory filling when writing int vs uint16_t
我一直在浏览一些代码,我看到了一件有趣的事情:在某些时候有一行
pTable[i] = ((int *)val)[i]; // case 1
pTable
是一个uint16_t
指针,val 是一个void
指针;所以我想把它改成
pTable[i] = ((uint16_t *)val)[i]; // case 2
并发现了输出中的一些差异。所以我开始首次亮相,看到记忆的排列方式不同。假设 void 指针中的数据类似于 val[0] = 0x1234
和 val[1] = 0x5678
- 在第一种情况(案例 1(中,内存转储显示
addr 56781234
- 而在第二个(案例 2(中,内存转储显示
addr 00001234 00005678
代码是一个巨大的,不是我的,我不能放在这里,但它是一个解析器(它从文件中读取值(。到达该空指针的内容可能是int
或float
值(在我的情况下,它们是int
(。
我想这是关于解释指针数据的事情,但我自己无法解释,有人可以向我解释吗?谢谢
int
在您的系统上可能是 32 位的,而uint16_t
是 16 位的。
这意味着在第一种情况下,您将在val[i]
地址访问 32 位信息,在第二种情况下只需访问 16 位信息。
内存中的位置也会发生变化,因为[]
运算符会根据val
的类型转换为此*(val + i)
。换句话说,除非i
为 0,否则((int *)val)[i];
与 ((uint16_t *)val)[i];
不在同一地址;
"i"乘以sizeof(val[0])
将确定val
地址的偏移量。
让我们将行pTable[i] = ((int *)val)[i];
分成几部分,以便更容易理解:
void* val = something; // val points to an object of some type.
uint16_t* pTable = something_else; // ptable points to a uint16_t object
int* intPtr = (int *)val; // We assume that val points to an int object.
int value = intPtr[i]; // Furthermore, we assume that the pointed int
// object is within an array of int objects.
// This expression gets the value of an int
// object that is i'th sibling element after
// the one pointed by val.
uint16_t converted = value; // This step is an implicit conversion
// in the original line.
pTable[i] = converted; // we assume that pTable also points to an
// element of an array and assign the i'th
// successor of element pointed by pTable
因此,如果将强制转换从 (int*)
更改为 (uint16_t*)
,那么您将假设val
指向一个uint16_t
数组。显然,这与val
指向一系列int
的假设相矛盾。
因此,如果我们假设原始程序是正确的,那么val
确实指向一个 int
数组 .因此,使用指向uint16_t
的指针读取此类值将具有未定义的行为,因为这违反了指针别名规则。
- 将字符串存储在c++中的稳定内存中
- 在c++中用vector填充一个简单的动态数组
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 内存集不会填充整个指针数组 c++
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 结构/类是否以某种方式影响内存填充
- 写入 int 与 uint16_t 时的内存填充
- 根 - 填充失败分支:内存驻留树
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 填充 2D 动态数组时"无法读取内存"
- std::bitset 是否保证连续内存以及结构中的恒定大小(以避免填充?
- 为什么这个字符数组包含未填充的内存
- C++编译器内存填充:对象是否应该具有相同的大小
- 稀疏矩阵的填充非常慢,在本征中没有内存增益
- 使用__declspec的内存填充问题
- [C++]在此代码之前不存在的析构函数中引发的内存错误。尝试创建一个新的动态数组并填充它
- 内存填充问题
- 使用内存变量初始化填充位结构体
- C/ c++线程调用填充内存
- Cython:让python创建要用C++填充的内存