2013-11-26 1 views
0

Я видел следующий код в проекте я работаю:Последний член в структурах типа T [1] вместо T *

struct Str 
{ 
    size_t count; 
    T data[1]; 
}; 

Str* str = (Str*)malloc(sizeof(Str) + sizeof(T) * count); 
str->count = count 
... 

str->data используется как массив с count элементами T с этой точки.

Почему бы не объявить T data[1] вместо T* data? Есть ли польза от этого?

+2

Подробнее читайте здесь: http://c-faq.com/struct/structhack.html – StoryTeller

+0

Чтобы инициализировать его пространством для одного элемента? Тем не менее, мне действительно не нравится это делать, когда вы собираетесь изменить размер позже. –

+0

@LordZsolt, но не для изменения размера, но если размер фиксирован, но известен только во время выполнения. Я понимаю, почему он популярен. – StoryTeller

ответ

2

Ваш код не действителен C++.

Однако, это действительно C, своего рода. Стандартный способ записи на C состоит в том, чтобы объявить конечный элемент как T data[]; («массив гибкой длины»), и цель состоит в том, чтобы позволить вам выделить один отдельный динамический блок памяти и сохранить как фиксированный заголовок, так и переменную -length в нем вместе.

Существует несколько ограничений на использование такого типа (например, он не может быть типом автоматической переменной или элемента массива). См. Например, the GCC implementation, который предлагает несколько нестандартных расширений.

+0

Компилирует в порядке, используя как минимум 2 компилятора C++: http: // ideone. com/FYkBU9 – Felics

+0

Предполагая, что тип POD-типа есть что-нибудь в стандарте C++, что делает его недействительным C++? –

+1

@RetiredNinja да, есть. C++ не имеет возможности для доступа к памяти за пределами * объявленных * индексов фиксированного массива или допустимости значения указателя за пределами последнего элемента. C специально вызвал поддержку «гибкого элемента массива» в 6.7.2.1-18. В C++ такой поддержки нет, о которой я знаю. Он может компилироваться. Черт, он может даже «работать», но не потому, что язык говорит об этом. – WhozCraig

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