gpt4 book ai didi

arrays - 如何使用 C 中的寄存器存储类创建数组?

转载 作者:行者123 更新时间:2023-12-03 14:19:18 25 4
gpt4 key购买 nike

我们知道用寄存器存储类声明的变量的地址是不能取的。所以我尝试用 register 关键字创建一个数组并尝试访问元素。但我注意到编译器没有引发任何错误。

#include <stdio.h>
void main()
{
register int x[]={3,4};
printf("%d\n",x[0]); // compiled successfully
// printf("%d",&x[0]);// compiler raises an error
}
众所周知,编译器将表达式 x[0] 转换为 *(x+0),其中 x 表示基地址。但是怎么可能得到数组的基地址,因为它是用寄存器存储类声明的?
提前致谢..

最佳答案

在 C 标准下,你可以用 register 声明一个数组。存储类,但基本没用;任何尝试使用该数组来形成指针,更不用说取消引用该指针(以访问数组的元素),都会导致未定义的行为。 C17 (n2176) 6.3.2.1 (3):

Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literalused to initialize an array, an expression that has type “array of type” is converted to an expressionwith type “pointer to type” that points to the initial element of the array object and is not an lvalue.If the array object has register storage class, the behavior is undefined.


事实上,正如脚注 123 到 6.7.1 (6) 中所强调的,几乎是唯一可以合法对 register 做的事情。数组是取 sizeof其中。
所以你的例子有未定义的行为;完全由编译器决定如何处理它。一个合理的选择,你可能会做什么,就是忽略 register关键字并将数组视为任何其他数组。这是明智的,因为现代编译器忽略了 register无论如何,几乎在所有其他情况下都使用关键字,并自行决定何时将变量优化到寄存器中。不允许忽略的一件事是尝试应用 &运算符,因为这违反了 6.5.3.2 (1) 的约束,这解释了为什么在尝试执行此操作时会出现错误。

关于arrays - 如何使用 C 中的寄存器存储类创建数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67051964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com