- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在另一个问题中我看到&studmark[STUDNO][0]
哪里STUDNO
是数组的大小。
我现在想知道该代码是否已经是未定义的行为。 studmark[STUDNO]
是最后一位,虽然它可能被创建,但不能被访问。正在使用 [0]
对其进行索引那么形成的地址有效吗?或者必须简单地使用studmark[STUDNO]
然后它会降级为一个指针?
无论哪种方式,请引用标准。
更新:示例代码和输出
#include <stdio.h>
#define STUDNO 16
int studmark[STUDNO][2];
int main() {
printf("&studmark = %p\n", studmark);
printf("&studmark[1][0] = %p\n", &studmark[1][0]);
printf("&studmark[STUDNO-1][0] = %p\n", &studmark[STUDNO-1][0]);
printf("&studmark[STUDNO][0] = %p\n", &studmark[STUDNO][0]);
return 0;
}
编译没有给出警告和输出:
./foo
&studmark = 0x601060
&studmark[1][0] = 0x601068
&studmark[STUDNO-1][0] = 0x6010d8
&studmark[STUDNO][0] = 0x6010e0
最佳答案
鉴于 studmark
的定义如下所示:
int studmark[STUDNO][2];
然后表达式&studmark[STUDNO][0]
调用undefined behavior .
为了使指针取消引用更加明显,首先我们将从数组索引表示法切换为指针表示法。 C11 标准第 6.5.2.1p2 节规定:
The definition of the subscript operator
[]
is thatE1[E2]
is identical to(*((E1)+(E2)))
所以上面的表达式就变成了:
&*(studmark[STUDNO] + 0)
变成:
&*(*(studmark + STUDNO) + 0)
此表达式以 &
和 *
运算符开头。当 &
位于 *
之前时,它们会相互抵消。第 6.5.3.2p3 节对此进行了详细说明:
The unary
&
operator yields the address of its operand. If the operand has type "type", the result has type "pointer to type". If the operand is the result of a unary*
operator, neither that operator nor the&
operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue.
所以这可以简化为:
*(studmark + STUDNO) + 0
现在我们看看添加的内容。这是有效的,因为根据第 6.5.6p8 节,创建指向超出数组末尾的一个元素的指针是合法的:
When an expression that has integer type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integer expression. In other words, if the expression
P
points to the ith element of an array object, the expressions(P)+N
(equivalently,) and
N+(P)(P)-N
(whereN
has the value n) point to, respectively, the i+nth and i−nth elements of the array object, provided they exist. Moreover, if the expressionP
points to the last element of an array object, the expression(P)+1
points one past the last element of the array object, and if the expressionQ
points one past the last element of an array object, the expression(Q)-1
points to the last element of the array object. If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. If the result points one past the last element of the array object, it shall not be used as the operand of a unary*
operator that is evaluated.
这意味着studmark + STUDNO
是一个有效的指针,但不能取消引用。这就是问题所在。*(studmark + STUDNO)
会调用未定义的行为,因为它取消引用超出数组末尾的一个元素。
因此 &studmark[STUDNO][0]
是未定义的行为。
相反,这是有效的:
&studmark[STUDNO]
因为它等于:
&*(studmark + STUDNO)
随后:
studmark + STUDNO
因为它创建一个指向数组末尾之后的一个元素的指针,但不会取消引用它。
关于c - 构成末尾之后第一个元素的地址是合法还是越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58858493/
您好,我正在使用 AWS EKS 开发 kubernetes。当我将 docker-compose 文件转换为 kompose 文件时,我遇到了 kompose 文件的问题,我遇到了卷挂载点问题,而且
在将密码转换为二进制哈希值以存储在数据库中时,我注意到除了通常的乱码之外,还有一些引号、空格和字母表,这些巧合可能构成有效 SQL 语句的一部分。 出于好奇,我想知道是否有人遇到过任何字符串在哈希后神
我的组件具有动态部分和 compose。动态部分在其他模块中,即节点项目。 如果我想在页面中使用自定义元素,例如: 我收到一条错误消息,指出无法在 ./my-custom-element/someV
我有一个 pandas 数据框,其中一列由数组组成。所以每个单元格都是一个数组。 假设数据框 df 中有一个列 A,这样 A = [ [1, 2, 3], [4, 5, 6],
当 HTTP 请求和响应在互联网上传输时,请求中文本的格式是什么?是 ASCII 码吗? 例子:如果 HTTP 请求如下所示 - GET /mysite/ HTTP/1.1 -- rest of t
我是一名优秀的程序员,十分优秀!