нижний индекс массив, имеющий класс хранения регистра - PullRequest
0 голосов
/ 09 мая 2018

В руководстве по 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;
}

Может кто-нибудь объяснить, что подразумевается под выражением жирным шрифтом? Или я ошибся, чтобы подтвердить это.

1 Ответ

0 голосов
/ 09 мая 2018

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, вы должны использовать более старую версию GCC, чем 4.8.1. Или вы используете какой-то другой компилятор, который не так совместим со стандартами, как GCC.

...