Tag: 标准 合规

根据标准,C中的指针标记是否未定义?

一些动态类型语言使用指针标记作为识别或缩小所表示值的运行时类型的快速方法。 执行此操作的经典方法是将指针转换为适当大小的整数,并在最低有效位上添加标记值,对于对齐对象,这些位被假定为零。 当需要访问对象时,标记位被屏蔽掉,整数转换为指针,指针被正常解除引用。 这本身就是有序的,除了它都取决于一个巨大的假设:对齐的指针将转换为保证在正确位置具有零位的整数。 是否可以根据标准的字母来保证这一点? 虽然标准的6.3.2.3节(参考C11草案)说从指针到整数的转换结果是实现定义的,但我想知道的是6.5.2.1和6.5.6中的指针算术规则是否有效约束指针 – >整数转换的结果遵循许多程序已经假设的相同的可预测算术规则。 (6.3.2.3注释67似乎表明这是标准的预期精神 ,而不是那意味着很多。) 我特别想到的情况是,人们可能会分配一个大型数组作为动态语言的堆,因此我们所讨论的指针就是这个数组的元素。 我假设C分配数组本身的开始可以通过某些辅助手段放置在对齐位置(尽管如此也是这样讨论)。 假设我们有一个八字节“cons cell”数组; 我们可以保证指向任何给定单元格的指针将转换为标记最低三位的整数吗? 例如: typedef Cell …; // such that sizeof(Cell) == 8 Cell heap[1024]; // such that ((uintptr_t)&heap[0]) & 7 == 0 ((char *)&heap[11]) – ((char *)&heap[10]); // == 8 (Cell *)(((char *)&heap[10]) + 8); // == &heap[11] &(&heap[10])[0]; // == &heap[10] […]

表达式的定义行为

C99标准以6.5.2美元计价。 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外, 先前的值应该是只读的,以确定要存储的值 。 (我强调) 它继续指出,以下示例是有效的(一开始看似很明显) a[i] = i; 虽然它没有明确说明我和i是什么。 虽然我相信它没有,但我想知道这个例子是否涵盖以下情况: int i = 0, *a = &i; a[i] = i; 这不会更改i的值,而是访问i的值以确定放置值的地址。 或者我们为i分配一个已经存储在i的值是无关紧要的? 请说清楚。 奖金问题; 那a[i]++或a[i] = 1怎么样?