2

在 GNU c99 手册中:

3.13 数组下标

您可以通过指定数组的名称和括在括号中的数组下标(或索引或​​元素编号)来访问数组元素。下面是一个示例,假设有一个名为 my_array 的整数数组:

my_array[0] = 5;

数组下标表达式 A[i] 被定义为与表达式 (*((A)+(i))) 相同。这意味着数组名称的许多用途等同于指针表达式。这也 意味着您不能为具有寄存器存储 的数组下标。

我已经尝试过以下事情,对我来说效果很好。

#include <stdio.h>

int main()
{
        register int arr[10] = {1, [9] = 6};

        printf("arr[9] %d\n", *((arr) + 9)); // working fine
        printf("arr[9] %d\n", arr[9]); //working fine
        return 0;
}

有人可以解释一下粗体字是什么意思吗?或者我试图错误地验证它。

4

1 回答 1

1

GCC 8.1 产生:

$ gcc rega89.c
rega89.c: In function ‘main’:
rega89.c:7:9: error: address of register variable ‘arr’ requested
         printf("arr[9] %d\n", *((arr) + 9)); // working fine
         ^~~~~~
$

那是没有任何额外的选择。事实上,即使是 GCC 4.8.1 也没有任何选择。(GCC 8.1 默认为 C11;GCC 4.8.1 默认为 C90;指定-std=c99-std=gnu99没有区别。)

因此,如果您使用 GCC,则必须使用比 4.8.1 更旧的 GCC 版本。或者您正在使用其他一些不像 GCC 那样符合标准的编译器。

于 2018-05-09T03:32:01.537 回答