c - malloc'ed 块是否允许指针算术?
问题描述
我正在阅读 C 标准中的以下内容:
(6.5.6 加法运算符)
9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。
现在我想知道什么被认为是“数组对象”。更具体地说,我想知道以下愚蠢的例子是否合法?分配的内存块是否被视为一个“数组对象”?
uint8_t *data = malloc(255);
uint8_t *end = data + 255;
ptrdiff_t size = end - data;
解决方案
我在标准中找不到任何充分定义“数组对象”的确切组成部分的内容,但是查看 C11 标准草案 7.22.3 中的内存分配函数,我确实发现了这一点:
连续调用对齐的 alloc、calloc、malloc和realloc 函数分配的存储顺序和连续性是未指定的。如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。
它并不像人们想要的那样明确,但它确实表明从这些函数返回的内存可以用作数组,因此应该应用指针算法的规则。
推荐阅读
- javascript - 在我的应用程序中播放本地音频文件而不使用输入类型文件
- vue.js - 我想使用来自两个组件的相同路由如何使用 vue 路由器执行此操作
- javascript - 如何刷新/重新加载 php 函数而无需刷新整个页面?
- php - 在使用codeigniter并从curl获取数据时在ajax中添加href
- javascript - 使用 JavaScript 将用户输入从表单存储到记录数组中
- python-3.7 - 提取特定字符串后的数字
- svg - 使用 svg-sprite-loader 导入 SVG 的 Jest 测试组件
- php - 拆分 ID 在不同位置添加连字符
- matlab - 用 pcolor 在 matlab 中绘制 geotiff
- javascript - Javascript 说对象值未定义。我究竟做错了什么?