2011-01-24 2 views
2

Я просто наткнулся на какой-то код, который декларирует-структуру в классе C++ следующим образом:Объявление массива в конце структуры?

struct T 
{ 
     int data; 
     T* next; 
} array[0]; 

Что такого рода заявления делать? Какое влияние оказывает установка «array [0]» в конце определения структуры?

+1

Это последняя вещь в определении класса? – ruslik

+0

@ruslik: Нет. Он находится в приватном разделе перед некоторыми другими встроенными функциями. – Rohit

+0

Есть ли 'typedef' для' T'? Является ли поле «следующий» поле действительным без одного? – thkala

ответ

3

Ahh, это почти "Элемент гибкой решетки".

Он был оформлен в C99, но это старый трюк C, который создает динамический массив. Выделите больше памяти для объекта, и вы можете хранить больше элементов в массиве.

Я думаю, что использование конкретного 0 есть компромисс, так как фактические [] гибкие массивы не были в C89 или C++. Чем больше каноническое использование этого шаблона составляет ...[1].

1

Это означает, что определение структуры доступно только внутри этого класса.

+0

Спасибо. Более конкретно, я хотел знать, какой эффект делает «массив [0]» в конце? – Rohit

+0

Я думаю, что он ссылается на 'array [0]' часть своего вопроса .. – jrharshath

1

Это попытка объявить тип, T и массив нулевого размера T. Однако нелегко объявить массив с нулевым размером в C++. Код недействителен.

1

В некоторых компиляторах, таких как GCC a zero length array является синонимом гибкого элемента class/struct, объявленного с использованием нотации [].

0

Не уверен, что если это так, но:

Когда структура должна содержать C строку переменной длины (которая не будет меняться после инициализации), то вместо того чтобы писать:

struct x { 
    int key; 
    const char* s; 
}; 

когда мы будем нуждаться в двух malloc «с (один для структуры, и один для строки), мы можем написать

struct X2 { 
    int key; 
    char s[1]; 
}x2; 
// and use it like 
x2* tmp = (x2*)malloc(sizeof(x2) + strlen(str)); 

Здесь мы имеем только один malloc для обеих сторон, структурировать d строка.

Когда последний атрибут структуры является массивом, то, выделяя пространство переменных для структуры, мы можем выделить его с переменным числом таких членов. Я думаю, это происходит в вашем случае.

0

Хорошо известно, как С STRUCT хака, но take care, когда вы используете его

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