2015-03-30 4 views
1

Стандарт-§6.7.2.1.18-говорит, чтоВозможно ли изменение смещения элемента гибкой матрицы?

Однако, когда. (или ->) имеет левый операнд, который является (указателем на) структуру с гибким членом массива, а правый операнд - этим членом, он ведет себя так, как если бы этот элемент был заменен самым длинным массивом (с тем же типом элемента), который не сделает структуру больше, чем объект, к которому обращаются; смещение массива должно оставаться равным элементу гибкого массива, , даже если это будет отличаться от размера заменяющего массива.

Проблема в том, что я не понимаю, что означает стандарт в последнем утверждении. Учитывая, что мы обычно выделяем достаточно памяти, используя malloc() - для элемента гибкого массива вместе с, который из других членов, как можно иметь несходные смещения?

ответ

0

Он говорит, что если мы имеем:

struct A 
{ 
    int x; 
    int a[]; 
}; 

struct B 
{ 
    int x; 
    int b[20]; 
}; 

// ... 
A *pa = malloc(sizeof(struct A) + sizeof(int[20])); 
B *pb = malloc(sizeof(struct B)); 

затем ptr->a ведет себя так же, как ptr->b, за исключением того offsetof(struct B, b) и offsetof(struct A, a), которые являются время компиляции константы, могут быть различными.

В следующих параграфах есть несколько примеров.

NB. Они также ведут себя по-разному под действием sizeof, поэтому этот параграф выглядит немного неполноценным.

+0

Это из-за структуры прокладки? – user227248

+0

@ пользователь227248 извините, что? –

+0

Я имею в виду, что данные должны иметь смещение памяти, которое несколько кратно слову. – user227248

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