2015-11-21 4 views
0

В настоящее время я изучаю компилятор LLVM. В их языковой ссылке (http://llvm.org/releases/3.7.0/docs/LangRef.html#getelementptr-instruction) они приводят некоторый код C в качестве примера для команды getelementptr. Но я не понимаю, как этот код может работать.Что делает этот кусок кода? Доступ к структуре через индекс?

struct RT { 
    char A; 
    int B[10][20]; 
    char C; 
}; 

struct ST { 
    int X; 
    double Y; 
    struct RT Z; 
}; 

int *foo(struct ST *s) { 
    return &s[1].Z.B[5][13]; 
} 

Что делает s[1] здесь?

Получает ли доступ к структуре с индексом?

Как получить элемент Z здесь?

ответ

0

Любой указатель, struct ST * в этом случае, может рассматриваться как указатель на массив. При написании s[1] программист предполагает, что foo получает массив по меньшей мере двух объектов struct ST. (Если программист ошибается в этом, у программы есть неопределенное поведение.)

Итак, s[1] обращается ко второму элементу массива, на который указывает S. Этот элемент является struct ST, поэтому .Z обращается к своему полю Z, который является struct RT. .B достигает внутри struct RT для поля B, представляющего собой двумерный массив, и, наконец, [5][13] индексирует определенное целое число в этом массиве.

Оператор & оценивается после всех этих операций и извлекает адрес этого конкретного целого, являющийся результатом функции.

Я не знаком с промежуточным представлением LLVM, но getelementptr звучит как правдоподобное имя для ИК-оператора, который реализует цепочку индексирования и доступа к полю и возвращает указатель.

0

s имеет тип struct ST *, указатель на struct ST. Массивы и указатели более или менее одинаковы в C (с некоторыми оговорками). Таким образом, s[1] является struct ST.

.Z обращается к элементу Z в нем, который является struct RT. .B обращается к элементу B в этой структуре и затем берет элемент [5][13] этого и, наконец, использует &, чтобы вернуть адрес этого элемента.

0

Получает ли доступ к структуре с индексом?

No. struct ST *s: s указатель, так что может указывать на какой-то массив элементов типа ST.

s[1] получает второй элемент такого массива. s[1] эквивалентно (*(s+1)).

0

Поскольку у нас есть struct ST *s, мы также знаем, что s [1] имеет тип struct ST. Он просто обрабатывает s как указатель на первый элемент массива-структуры-S.

Смежные вопросы